左值引用與右值引用

2021-09-28 23:15:39 字數 880 閱讀 9849

引用的本質是乙個閹割的指標,它是乙個物件的別名,通過操作符&來實現,c++11又提出了乙個左值引用與右值引用的概念。這裡提一下變數的兩個屬性:左值和右值,左值是變數的位址,右值是變數儲存的內容,變數的本質即儲存空間的名稱,編譯後為對應的位址。

左值引用:

乙個c++引用宣告後必須被初始化,否則會編譯不過,初始化之後就相當於乙個變數。由於擁有共同位址,而且也是同一型別,所以對其操作就相當於對原物件操作,用法和普通的變數相同。與指標最大的區別就是指標是一種資料型別,而引用不是。當其作為函式入參時,傳遞的就是變數的左值,既是位址。

右值引用:

為了支援移動操作,新標準引入了右值引用,所謂的右值引用,就是必須繫結到右值的引用,我們通過&&而不是&來獲得右值引用,右值引用有乙個重要的特性:只能繫結到乙個將要銷毀的物件。因此我們可以自由的將乙個右值引用的資源移動到另乙個物件中。

左值和右值是表示式的屬性,一些表示式生成或要求左值,鎖而另外一些則生成或要求右值。一般而言,乙個左值表示式表示的是乙個物件的身份,而乙個右值表達的是乙個物件的值。

右值引用也不過是乙個物件的另乙個名字而已,我們不能將其繫結到要求轉化的表示式,字面常量或是返回右值的表示式,右值引用有著完全相反的繫結特性,我們可以將乙個右值引用繫結到這類表示式上,但不能將乙個右值直接繫結到左值上。

int i=42;

int &r=i ; //正確,r引用i

int &&rr=i; //錯誤,不能將乙個右值引用繫結到乙個左值上。

int &r2 = i*42;// 錯誤,i*42是乙個右值。

const int &r3= i*42;//正確,可以將乙個const的引用繫結到乙個右值上。

int &&rr2 = i *42 ;//正確,將rr2都繫結到乘法結果上。

左值 右值 左值引用 右值引用

2015 06 01 15 07 404人閱讀收藏 舉報 c 11 5 一 c 中的左值和右值 誤區 左值位於等號左邊,右值位於等號右邊。c 11中的定義 左值表示式表示的是乙個物件的身份 在記憶體中的位置 而右值表示式表示的是物件的值 內容 左值和右值都是針對表示式而言的,左值是持久的,右值是短暫...

左值 左值引用 右值 右值引用

1 左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。2 引用 引用是c 語法做的優化,引用的本質還是靠指標...

左值 左值引用 右值 右值引用

1 左值和右值的概念 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。2 引用 引用是c 語法做的優化,引用的本質還是靠指標...