為了支援移動操作,新標準引入了一種新的引用型別——右值引用(rvalue reference)。所謂右值引用就是必須繫結到右值的引用。我們通過&&而不是&來獲得右值引用。右值引用有乙個重要的性質——只能繫結到乙個將要銷毀的物件。因此,我們可以自由地將乙個右值引用的資源「移動」到另乙個物件中。
一般而言,乙個左值表示式表示的是乙個物件的身份,而乙個右值表示式表示的是物件的值。
左值持久;右值短暫。考察左值和右值表示式的列表,兩者相互區別之處就很明顯了:左值有持久狀態,而右值要麼是字面常量,要麼是在表示式求值過程中建立的臨時物件。
由於右值引用只能繫結到臨時物件,我們得知
1、所引用的物件將要被銷毀
2、該物件沒有其它使用者
這兩個特性意味著:使用右值引用的**可以自由地接管所引用的物件的資源。
雖然不能將乙個右值引用直接繫結到乙個左值上,但我們可以顯式地將乙個左值轉換為對應的右值引用型別。我們可以通過呼叫乙個名為move的新標準庫函式來獲得繫結到左值上的右值引用,此函式定義在標頭檔案 utility上。
int rr1 = 3;
int &&rr = std::move(rr1);
move呼叫告訴編譯器:我們有乙個左值,但我們希望像乙個右值一樣處理它。我們必須認識到,呼叫move就意味著承諾:除了rr1賦值或銷毀它外,我們將不再使用它。在呼叫move之後,我們不能對移後源物件的值做任何假設。
只有乙個類沒有定義任何自己版本的拷貝控制成員,且它的所有資料成員都能移動構造或移動賦值時,編譯器才會為它合成移動建構函式或移動賦值運算子。
c 左值 右值 右值引用 左值引用
c 裡一切值必須屬於左值 右值兩者之一。左值 一切變數 包括用const修飾的變數 物件 包括引用都屬於左值 右值 一切字面值 可以是巨集 臨時無名物件 函式返回值 表示式 如a n 說明一下 函式返回值,返回的是某乙個型別的值,並不是返回變數。左值並不是說能放在 左邊的值就是左值 雖然用const...
c 左值 右值 左值引用 右值引用
在c語言中,左值認為是賦值語句的左側,右值認為是賦值語句的右側。在c 中,意義稍有不同。c 中,每乙個表示式會產生乙個左值或者右值,相應的,該表示式也就被稱作 左值表示式 右值表示式 乙個左值表示式的求值結果是乙個物件或者是乙個函式。左值可以當右值使用,而右值不能當左值使用。c prime 中這麼簡...
C 左值 右值 左值引用 右值引用
就變數而言,對於一些變數,我們只會讀取並使用它們的值,而不會改變他們的值 唯讀 對於其餘的變數,我們既會讀取它們的值,有的時候還會改變它們的值 讀寫 這是很常見的。在c 中,前一種變數稱為右值,後一種變數稱為左值,例如 int a 1 a是左值,1是右值稍稍不同的一點是,在c 中,乙個變數是左值還是...