C 移動語義和右值引用

2021-08-24 17:32:39 字數 1107 閱讀 7600

移動語義類似於在計算機中移動檔案的情形:實際檔案還留在原來的地方,而只修改記錄。

例如有乙個函式,它返回乙個vector物件:

要實現移動語義,需要讓編譯器知道什麼時候需要複製,什麼時候不需要。這就是右值引用發揮作用的地方。

可定義兩個建構函式,其中乙個是常規複製建構函式,它使用const左值引用作為引數,這個引用關聯到左值實參,如語句#1中的vstr;另乙個是移動複製建構函式,它使用右值引用作為引數,該引用關聯到右值實參,如語句#2中的alloc(vstr)的返回值。

複製建構函式可執行深拷貝,而移動建構函式只調整記錄。在將所有權轉移給新物件的過程中,移動建構函式可能修改其實參,這意味著右值引用引數不應是const。

乙個移動示例:

適用於建構函式的移動語義考慮也適用於賦值運算子。

強制移動

移動建構函式和移動複製運算子使用右值。如果讓它們使用左值,該怎麼辦呢?

可使用運算子static_cast<>物件的型別強制轉換為unless &&,c++11提供了一種更簡潔的方式——使用標頭檔案 utility 中宣告的函式 move()。

需要知道的是move()並非一定會導致移動操作:

表示式move(one)是右值。如果chunk沒有定義移動賦值運算子,編譯器將使用複製賦值運算子。如果也沒有定義複製賦值運算子,將根本不允許上述賦值。

右值引用和移動語義

在c 當中,所有的變數和表示式都被分為左值和右值。所謂的左值,就是可以被定址的非臨時變數。右值就是無法被定址的臨時變數。左值引用用 符號表示,右值引用用 符號表示。左值引用 int n int np new int const int cn 100 int nr n int npr np const...

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

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

C 11 右值引用和移動語義

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