1. 程式人生 > >C++右值引用

C++右值引用

說明

    為了支援移動操作,新標準引入了一種新的引用型別——右值引用(rvalue reference)。所謂右值引用就是必須繫結到右值的引用。我們通過&&而不是&來獲得右值引用。右值引用有一個重要的性質——只能繫結到一個將要銷燬的物件。因此,我們可以自由地將一個右值引用的資源“移動”到另一個物件中。

左值vs右值

    一般而言,一個左值表示式表示的是一個物件的身份,而一個右值表示式表示的是物件的值。

    左值持久;右值短暫。考察左值和右值表示式的列表,兩者相互區別之處就很明顯了:左值有持久狀態,而右值要麼是字面常量,要麼是在表示式求值過程中建立的臨時物件。

    由於右值引用只能繫結到臨時物件,我們得知

    1、所引用的物件將要被銷燬

    2、該物件沒有其它使用者

這兩個特性意味著:使用右值引用的程式碼可以自由地接管所引用的物件的資源。

標準庫move函式

    雖然不能將一個右值引用直接繫結到一個左值上,但我們可以顯式地將一個左值轉換為對應的右值引用型別。我們可以通過呼叫一個名為move的新標準庫函式來獲得繫結到左值上的右值引用,此函式定義在標頭檔案 utility上。

int rr1 = 3;
int &&rr = std
::move(rr1);

    move呼叫告訴編譯器:我們有一個左值,但我們希望像一個右值一樣處理它。我們必須認識到,呼叫move就意味著承諾:除了rr1賦值或銷燬它外,我們將不再使用它。在呼叫move之後,我們不能對移後源物件的值做任何假設。

自定義類的右值引用

    只有一個類沒有定義任何自己版本的拷貝控制成員,且它的所有資料成員都能移動構造或移動賦值時,編譯器才會為它合成移動建構函式或移動賦值運