1. 程式人生 > 其它 >c++ 右值引用(&&)和左值引用(&)

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 - 部落格園