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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM