[2] 右值引用:
c++中,左值通常指可以取位址,有名字的值就是左值,而不能取位址,沒有名字的就是
右值。而在指c++11中,右值是由兩個概念構成:將亡值和純右值。純右值是用於識別臨
時變數和一些不跟物件關聯的值,比如1+3產生的臨時變數值,2、true等,而將亡值通常
是指具有轉移語義的物件,比如返回右值引用t&&的函式返回值等。
c++11中,右值引用就是對乙個右值進行引用的型別。由於右值通常不具有名字,所以我們一般只能通過右值表示式獲得其引用,比如:
t && a=returnrvale();
假設returnrvalue()函式返回乙個右值,那麼上述語句宣告了乙個名為a的右值引用,其值等於returnrvalue函式返回的臨時變數的值。
基於右值引用可以實現轉移語義和完美**新特性。
轉移語義:
對於乙個包含指標成員變數的類,由於編譯器預設的拷貝建構函式都是淺拷貝,
所有我們一般需要通過實現深拷貝的拷貝建構函式,為指標成員分配新的記憶體
並進行內容拷貝,從而避免懸掛指標的問題。
完美**:
完美**是指在函式模板中,完全依照模板的引數的型別,將引數傳遞給函式模
板中呼叫的另乙個函式,即傳入**函式的是左值物件,目標函式就能獲得左值
物件,**函式是右值物件,目標函式就能獲得右值物件,而不產生額外的開銷
。因此**函式和目標函式引數一般採用引用型別,從而避免拷貝的開銷。其次
,由於目標函式可能需要能夠既接受左值引用,又接受右值引用,所以考慮**
也需要相容這兩種型別。
C 11中的右值和右值引用
左值和右值 1.對乙個物件被用作右值的時候,用的是物件的值 內容 當物件被用作左值的時候,用的是物件的身份 在記憶體中的位置 2.左值具有持久的狀態,而右值要麼是字面常量 注意字串常量是左值 要麼是在表示式求值過程中建立的臨時物件。3.返回左值引用的函式 賦值 下標 解引用 前置遞增 遞減運算子都是...
C 11 中的右值引用
右值引用的功能 首先,我並不介紹什麼是右值引用,而是以乙個例子裡來介紹一下右值引用的功能 include include usingnamespacestd classobj obj constobj other vectorfoo intmain 首先我們編譯一下這個函式,執行結果如下 tianf...
C11中的右值引用
二 參考鏈結 左值是指表示式結束後依然存在的持久物件,右值是指表示式結束時就不再存在的臨時物件。看能不能對表示式取位址,如果能,則為左值,否則為右值。所有的具名變數或物件都是左值,而右值不具名。捨棄 c 語言中的左值和右值概念 乙個是純右值 prvalue,purervalue 比如,非引用返回的臨...