淺識 C 11 右值引用

2021-08-18 15:09:44 字數 1398 閱讀 8914

引入右值引用的目的:為了支援移動操作和完美**。目的:解決臨時物件的問題,提高效率。

區分左值和右值:

左值跟右值都是針對表示式而言的;

左值:指表示式結束後依然存在的持久物件,變數是左值。

右值:指表示式結束時就不再存在的臨時物件,右值是可以取出位址的,要麼是字面常量,要麼是表示式求值過程中建立的臨時物件。

左值持久,右值短暫

例子:對於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 的基礎。而要理解右值引用,就必須先區分左值與右值。對左值和右值的乙個最常見的誤解是 等號左邊的就是左值,等號右邊的就是右值。左值和右值都是針對表示式而言的,左值是指表示式結束後依然存在的持久物...