C 風格 右值引用

2021-08-09 15:56:30 字數 867 閱讀 9498

只在定義移動建構函式與移動賦值操作時使用右值引用. 不要使用 std::forward.

定義:

右值引用是一種只能繫結到臨時物件的引用的一種, 其語法與傳統的引用語法相似. 例如,void f(string&& s); 宣告了乙個其引數是乙個字串的右值引用的函式.

優點:

用於定義移動建構函式 (使用類的右值引用進行構造的函式) 使得移動乙個值而非拷貝之成為可能. 例如, 如果 v1 是乙個vector, 則auto v2(std::move(v1))將很可能不再進行大量的資料複製而只是簡單地進行指標操作, 在某些情況下這將帶來大幅度的效能提公升.

右值引用使得編寫通用的函式封裝來**其引數到另外乙個函式成為可能, 無論其引數是否是臨時物件都能正常工作.

右值引用能實現可移動但不可拷貝的型別, 這一特性對那些在拷貝方面沒有實際需求, 但有時又需要將它們作為函式引數傳遞或塞入容器的型別很有用.

要高效率地使用某些標準庫型別, 例如std::unique_ptr, std::move是必需的.

缺點:

右值引用是乙個相對比較新的特性 (由 c++11 引入), 它尚未被廣泛理解. 類似引用崩潰, 移動建構函式的自動推導這樣的規則都是很複雜的.

結論:

只在定義移動建構函式與移動賦值操作時使用右值引用, 不要使用std::forward功能函式. 你可能會使用std::move來表示將值從乙個物件移動而不是複製到另乙個物件.

c 左值 右值 右值引用 左值引用

c 裡一切值必須屬於左值 右值兩者之一。左值 一切變數 包括用const修飾的變數 物件 包括引用都屬於左值 右值 一切字面值 可以是巨集 臨時無名物件 函式返回值 表示式 如a n 說明一下 函式返回值,返回的是某乙個型別的值,並不是返回變數。左值並不是說能放在 左邊的值就是左值 雖然用const...

c 左值 右值 左值引用 右值引用

在c語言中,左值認為是賦值語句的左側,右值認為是賦值語句的右側。在c 中,意義稍有不同。c 中,每乙個表示式會產生乙個左值或者右值,相應的,該表示式也就被稱作 左值表示式 右值表示式 乙個左值表示式的求值結果是乙個物件或者是乙個函式。左值可以當右值使用,而右值不能當左值使用。c prime 中這麼簡...

C 左值 右值 左值引用 右值引用

就變數而言,對於一些變數,我們只會讀取並使用它們的值,而不會改變他們的值 唯讀 對於其餘的變數,我們既會讀取它們的值,有的時候還會改變它們的值 讀寫 這是很常見的。在c 中,前一種變數稱為右值,後一種變數稱為左值,例如 int a 1 a是左值,1是右值稍稍不同的一點是,在c 中,乙個變數是左值還是...