引入右值引用的目的:為了支援移動操作和完美**。目的:解決臨時物件的問題,提高效率。
區分左值和右值:
左值跟右值都是針對表示式而言的;
左值:指表示式結束後依然存在的持久物件,變數是左值。
右值:指表示式結束時就不再存在的臨時物件,右值是可以取出位址的,要麼是字面常量,要麼是表示式求值過程中建立的臨時物件。
左值持久,右值短暫
例子:對於int a = 10;
++a和a++的區別:
a++:先將a的持久物件拷貝乙份,然後是持久物件a的值+1;最後返回的是那份拷貝的物件;所以他是右值。
++a:直接使持久物件的值+1,返回持久物件,所以他是左值。
所謂右值引用就是必須繫結到右值的引用。我們通過&&而不是&來獲取右值引用。
重要性質:只能繫結乙個將要銷毀的物件。
int a = 10; //a為左值,10為右值
int &r = a; //正確:r引用a
int &&rr = a; //錯誤:不能將乙個右值引用繫結到乙個左值上
int &r1 = a * 42;//錯誤:a*42是乙個右值(當前語句執行完後a*42的值就不在了)
const
int& r2 = a * 42;//正確:可以將乙個const的引用繫結到乙個右值上。
int &&rr1 = a * 42;//正確:將rr1繫結到乘法結果上
不能將乙個右值引用繫結到乙個右值引用型別的變數
int &&rr2 = 42;//正確:字面常量是右值
int &&rr3 = rr1;//錯誤:表示式rr1是左值,無法將右值引用繫結到左值
變數是左值;不能將乙個右值引用直接繫結到乙個變數上,即使這個變數是右值引用型別也不行
標準move函式:
解決不能將乙個右值引用繫結到乙個左值的方法:
1,顯示地將乙個左值轉換為對應的右值應用型別:
例如:
int a = 10;
int && rr = (int &&)a; //正確
2,呼叫move函式,獲得繫結到左值上的右值引用。
例如:
const
int a = 10;
int &&rr1 = 10;
int &&rr2 = std::move(a);//正確
int &&rr3 = std::move(rr1);正確
move告訴編譯器:我們有乙個左值,但是我們希望像乙個右值一樣處理它。
我們必須認識到,呼叫move就意味著有乙個承諾:除了對 rr1 賦值或者銷毀它外,我們將不能在使用,呼叫move後,我們不能對移後源物件的值做任何假設。
c 11 右值引用
右值引用 是一種復合型別,跟c 的傳統引用很類似。為更準確地區分兩種型別,我們把傳統的c 引用稱為 左值引用 而使用 引用 這一術語時,我們的意思同時包含兩種引用 左值引用和右值引用。右值引用的行為跟左值引用類似,不同之處在於 右值引用可以繫結到臨時量 右值 而 非const的 左值引用卻不能繫結到...
C 11 右值引用
消除兩個物件互動時不必要的物件拷貝,節省運算儲存資源,提高效率。能夠更簡潔明確地定義泛型函式。1.右值引用 int a a 1 here,a is an lvalue 上述的a就是乙個左值。c 11中左值的宣告符號為 為了和左值區分,右值的宣告符號為 printreference const str...
C 11右值引用
c 11中引入的乙個非常重要的概念就是右值引用。理解右值引用是學習 移動語義 move semantics 的基礎。而要理解右值引用,就必須先區分左值與右值。對左值和右值的乙個最常見的誤解是 等號左邊的就是左值,等號右邊的就是右值。左值和右值都是針對表示式而言的,左值是指表示式結束後依然存在的持久物...