左值和右值
首先區分一下什么是左值,什么是右值。
左值就是可以寫在賦值號左邊的,右值是寫在賦值號右邊的。
比如
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 - 博客園