C 11中的右值引用 移動語句和完美轉換

2022-06-24 06:15:07 字數 1014 閱讀 8649

c++11引入右值引用和移動語句,可以避免無謂的複製,提高程式的效能,右值引用記為t&&。

左值引用, 使用 t&, 只能繫結左值;

右值引用, 使用 t&&, 只能繫結右值

常量左值, 使用 const t&, 既可以繫結左值又可以繫結右值;

已命名的右值引用,編譯器會認為是個左值;

編譯器有返回值優化,但不要過於依賴

要實現移動語義就必須增加兩個函式:移動建構函式和移動賦值建構函式。

將左值轉化為右值,使用t std::move(t)。就是將原來的t型別有變數名的資料轉化為沒有變數名的資料,而原來的變數值變成空值。

通過std::is_same即可判斷兩個型別是否一樣,特別在模板裡面,在不清楚模板的引數時,此功能可以對一些特定的引數型別進行特殊的處理,在模板裡是利器!

在c++11中,拷貝構造/賦值和移動構造/賦值函式必須同時提供或同時不提供,程式設計師才能保證類同時具有拷貝和移動語義。只宣告其中一種的話,類都僅能實現一種語義。其實,只實現一種語義,在類的編寫中也是非常常見的。

只有移動語義的型別非常有趣,因為只有移動語義表示該型別的變數所擁有的資源只能被移動,而不能被拷貝。那麼這樣的自由必須是唯一的。因此,只有移動語義構造的型別往往都是「資源型」的型別。比如說智慧型指標,檔案流,都可以視為「資源型」的型別。

在標準庫中僅可移動的模板類:unique_ptr。vs2011,把ifstream這樣的型別實現為僅可移動的。

在裡,可通過一些輔助模板類來判斷乙個型別是否可以移動的,比如:

is_move_constructible, is_trivially_move_constructible, is_nothrow_move_constructible,使用方法仍然是使用其成員value。比如:

cout << is_move_constructible::value;

就可列印出unknown是否可以移動,這在一些情況下還是非常有用的。

有了移動語義,可以實現高效能的置換(swap)函式。只是置換指標,沒有資源的釋放與申請。

參考: (作者寫得好)

移動語義和右值引用(C 11)

左值 可以取位址 有名字的 右值 不能取位址 沒名字的 傳統的c 引用稱為左值引用,使得標誌符關聯到左值。c 11新增了右值引用,使用 表示。引入右值引用的主要目的之一是實現移動語義。在複製物件時,實現物件的移動而非拷貝。通過移動建構函式 移動賦值運算子實現 函式的引數為右值引用,函式內部並非深度複...

C 11 右值引用和移動語義

因為工作室要求寫技術部落格記錄學習到的知識點,自己之前是沒有寫過部落格的,所以現在用一篇介紹右值引用和移動語義的部落格作為部落格的第一篇,可能對於移動語義的理解還不夠深刻,但可以作為乙個簡單的介紹部落格 要理解好右值引用首先要知道什麼是左值?什麼是右值?1.左值是表示式結束後依然存在的持久化物件 2...

C 11中的右值和右值引用

左值和右值 1.對乙個物件被用作右值的時候,用的是物件的值 內容 當物件被用作左值的時候,用的是物件的身份 在記憶體中的位置 2.左值具有持久的狀態,而右值要麼是字面常量 注意字串常量是左值 要麼是在表示式求值過程中建立的臨時物件。3.返回左值引用的函式 賦值 下標 解引用 前置遞增 遞減運算子都是...