C++引用現在分為左值引用和右值引用。其實很好理解,左值引用中的左值指的就是能出現在等號左邊的值(帶名稱的變量,帶*號的指針等一類的數據),程序能對這樣的左值進行引用獲得其地址;右值引用中的右值指的就是出現在等號右邊的值(常量數字,或者函數的返回值(不能是左值引用類型),計算式的返回值等匿名不可訪問的數據),程序能對這樣的右值進行引用獲得其地址。也不知道對不對,反正可以簡單的理解為:能對其進行賦值操作的都是左值,不能對其進行賦值的都是右值。 引入右值引用的目的之一是實現移動語義。 移動語義的引入是為了解決在進行大數據復制的時候,將動態申請的內存空間的所有權直接轉讓出去,不用進行大量的數據移動,既節省空間又提高效率。要實現移動語義,就必須讓編譯器知道什麼時候復制,什麼時候移動語義,而這就是右值引用發揮作用的地方。移動語義可能修改右值的值,所以,右值引用參數不能是const。 通過構造復制構造函數和移動構造函數來實現復制和移動語義。復制構造使用const &引用,而移動構造函數使用非const && 引用。 被移動語義的數據交出了所有權,為了不出現析構兩次同一數據區,要將交出所有權的數據的指向動態申請內存去的指針賦值位nullptr,即空指針,對空指針執行delete[]是合法的。 編譯器判斷構造函數中是左值還是右值,然後調用相應的復制構造函數或者移動構造函數來構造數據。 強制移動,就是讓左值使用移動構造函數,強制讓其交出所有權。Utility文件中聲明,std::move()函數。 總結:利用匿名的變量,讓其交出所有權,避免復制數據,可以提高程序的效率,因此,如果一個臨時變量再也用不著了,可以讓其強制移動語義,這樣,程序不用再進行大量的數據復制了,尤其是在vector作為返回值的時候。