C 13 右值引用的解析和使用

2021-08-29 16:17:20 字數 1214 閱讀 6655

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繫結到乘法結果上

返回左值引用的函式,連同賦值、下標、解引用和前置遞增/遞減運算子,都是返回左值的表示式的例子。我們可以將乙個左值引用繫結到這類表示式的結果上。

返回非引用型別的函式,連同算術、關係、位以及後置遞增/遞減運算子,都生成右值。我們不能將乙個左值引用繫結到這類表示式上,但我們可以將乙個const的左值引用或者乙個右值引用繫結到這類表示式上。

變數可以看做只有乙個運算物件而沒有運算子的表示式,雖然我們很少這樣看待變數。類似其他任何表示式,變數表示式也有左值/右值屬性。變數表示式都是左值。帶來的結果就是,我們不能將乙個右值引用繫結到乙個右值引用型別的變數上:

int &&rr1 = 42;    //正確:字面常量是右值

int &&rr2 = rr1; //錯誤:表示式rr1是左值!

變數是左值,因此我們不能將乙個右值引用直接繫結到乙個變數上,即使這個變數是右值引用也不行。

但是,初始化過後,可以用乙個右值引用來給另乙個右值引用賦值:

int &&a = 1;

int &&b = 2;

a = b;

此時右值引用 a 對應的值為2

C 左值和右值,左值引用和右值引用

c 對於左值和右值沒有標準定義,但是有乙個被廣泛認同的說法 可見立即數,函式返回的值等都是右值 而非匿名物件 包括變數 函式返回的引用,const物件等都是左值。從本質上理解,建立和銷毀由編譯器幕後控制,程式設計師只能確保在本行 有效的,就是右值 包括立即數 而使用者建立的,通過作用域規則可知其生存...

C 左值引用和右值引用

include include includeusing namespace std int f int main 左值引用表示乙個物件的身份,右值引用表示物件的值 返回左值引用的函式 賦值 下標 解引用和前置遞增遞減運算子都是返回左值。不能把右值引用繫結在它們上,但可以把左值引用綁在它們上 返回非...

C 左值引用和右值引用

這篇blog主要介紹一下左值和右值的概念及應用陷阱 左值是可以放在賦值號左邊可以被賦值的值 左值必須要在記憶體中有實體 右值當在賦值號右邊取出值賦給其他變數的值 右值可以在記憶體也可以在cpu暫存器。乙個物件被用作右值時,使用的是它的內容 值 被當作左值時,使用的是它的位址。引用是c 語法做的優化,...