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 - 博客园