c++ 右值引用(&&)和左值引用(&)

左值和右值

首先区分一下什么是左值,什么是右值。
左值就是可以写在赋值号左边的,右值是写在赋值号右边的。
比如

Stu foo() {
    return Stu();
}
int a = 5; // a是左值
Stu s = foo(); // s是左值,foo()的返回值是右值
int c = a + b; // a + b 的结果是右值,c是左值

foo()返回了一个没有名字的Stu对象,你不能写foo() = s,所以foo()就是个右值。
还有一种定义说是,无法取地址的就是右值,可以取地址的是左值。

左值引用(&)和右值引用(&&)

首先要注意一点:&&不是“引用的引用”,这仅仅是一个记号,这个记号我改成$也没什么问题。不能像理解指针**是指针的指针这样去类比。
左值引用就是给左值变量起别名,右值引用就是给右值变量起别名。

int a = 5;
int &aa = a; //左值引用
Stu &&s = foo(); // 右值引用

Stu &&s = foo(),就是给foo()返回的临时对象起了个别名,本来它在foo()返回后生存期就到了,就该析构了,但是由于s对她进行了引用,他的生存期被延长至和s相同。如果是Stu s = foo()则会在赋值时发生一次拷贝构造。

附两篇写的很好的文章
C++ 11的移动语义 - 行者孙 - 博客园
C++11新特性:右值引用和转移构造函数 - DoubleLi - 博客园

posted @ 2021-08-24 11:47  王冰冰  阅读(412)  评论(0编辑  收藏  举报