二:參考鏈結
左值是指表示式結束後依然存在的持久物件,右值是指表示式結束時就不再存在的臨時物件。
看能不能對表示式取位址,如果能,則為左值,否則為右值。所有的具名變數或物件都是左值,而右值不具名。(捨棄 c 語言中的左值和右值概念)
乙個是純右值(prvalue, purervalue) , 比如,非引用返回的臨時變數、運算表示式產生的臨時變數、原始字面量和 lambda 表示式等都是純右值。
另乙個則是將亡值(xvalue, expiring value), 而將亡值是 c++11 新增的,與右值引用相關的表示式,比如將要被移動的物件、t&&函式返回值、std::move 返回值和轉換為 t&& 的型別的轉換函式的返回值。
示例:
int
main()
右值引用就是對乙個右值進行引用的型別。因為右值不具名,所以我們只能通過引用的方式找到它。無論宣告左值引用還是右值引用都必須立即進行初始化,因為引用型別本身並不擁有所繫結物件的記憶體,只是該物件的乙個別名。通過右值引用的宣告,該右值又「重獲新生」, 其生命週期與右值引用型別變數的生命週期一樣,只要該變數還活著,該右值臨時量將會一直存活下去。
如果希望把乙個左值賦給乙個右值引用型別該怎麼做呢?用 std::move:
int a =10;
int&&b = std::
move
(a);
std::move
可以將乙個左值轉換成右值。
string
(string && s)
:str
(s.str)
string &
operator
=(string && s)
return
*this
;}
move 只是轉移了資源的控制權,本質上是將左值強制轉換為右值引用,以用於 move 語義,避免含有資源的物件發生無謂的拷貝。move 對於擁有形如對記憶體、檔案控制代碼等資源的成員的物件有效。如果是一些基本型別,比如 int 和 char[ 10]陣列等,如果使用 move,仍然會發生拷貝(因為沒有對應的移動建構函式),所以說move 對於含資源的物件來說更有意義。
move原始碼
template
<
class
_ty>
inline
typename remove_reference<_ty>
::type &&
move
(_ty && _arg)
template
<
class
_ty>
struct remove_reference
;template
<
class
_ty>
struct remove_reference < _ty&
>
;template
<
class
_ty>
struct remove_reference < _ty&&
>
;
c++右值引用 C 11 中的右值引用
右值引用的功能 首先,我並不介紹什麼是右值引用,而是以乙個例子裡來介紹一下右值引用的功能 include include usingnamespacestd classobj obj constobj other vectorfoo intmain 首先我們編譯一下這個函式,執行結果如下 tianf...
c 11 右值引用
右值引用 是一種復合型別,跟c 的傳統引用很類似。為更準確地區分兩種型別,我們把傳統的c 引用稱為 左值引用 而使用 引用 這一術語時,我們的意思同時包含兩種引用 左值引用和右值引用。右值引用的行為跟左值引用類似,不同之處在於 右值引用可以繫結到臨時量 右值 而 非const的 左值引用卻不能繫結到...
C 11 右值引用
消除兩個物件互動時不必要的物件拷貝,節省運算儲存資源,提高效率。能夠更簡潔明確地定義泛型函式。1.右值引用 int a a 1 here,a is an lvalue 上述的a就是乙個左值。c 11中左值的宣告符號為 為了和左值區分,右值的宣告符號為 printreference const str...