C11中的右值引用

2021-10-17 19:32:22 字數 1696 閱讀 2794

二:參考鏈結

左值是指表示式結束後依然存在的持久物件,右值是指表示式結束時就不再存在的臨時物件。

看能不能對表示式取位址,如果能,則為左值,否則為右值。所有的具名變數或物件都是左值,而右值不具名。(捨棄 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...