右值引用

右值引用

右值引用(及其支持的移動語義Move semantics和完美轉發Perfect forwarding)是C++11中加入的最重大語言特性之一。

基本介紹

  • 中文名:右值引用
  • 外文名:rvalue reference
在C++98中,臨時量(術語為右值,因其出現在賦值表達式的右邊)可以被傳給函式,但只能被接受為const &類型。這樣函式便無法區分傳給const &的是真實的右值還是常規變數。而且,由於類型為const &,函式也無法改變所傳對象的值。C++0x將增加一種名為右值引用的新的引用類型,記作typename &&。這種類型可以被接受為非const值,從而允許改變其值。這種改變將允許某些對象創建轉移語義。比如,一個std::vector,就其內部實現而言,是一個C式數組的封裝。如果需要創建vector臨時量或者從函式中返回vector,那就只能通過創建一個新的vector並拷貝所有存於右值中的數據來存儲數據。之後這個臨時的vector則會被銷毀,同時刪除其包含的數據。有了右值引用,一個參數為指向某個vector的右值引用的std::vector的轉移構造器就能夠簡單地將該右值中C式數組的指針複製到新的vector,然後將該右值清空。這裡沒有數組拷貝,並且銷毀被清空的右值也不會銷毀保存數據的記憶體。返回vector的函式現在只需要返回一個std::vector<>&&。如果vector沒有轉移構造器,那么結果會像以前一樣:用std::vector<> &參數調用它的拷貝構造器。如果vector確實具有轉移構造器,那么轉移構造器就會被調用,從而避免大量的記憶體分配
考慮到安全因素,具名變數即使被聲明為右值類型也不會被當作右值。如需把它當作右值,須使用庫函式
std::move()。bool is_r_value(int &&){    return true;}bool is_r_value(const int &){    return false;}void test(int &&i){    is_r_value(i); // false    is_r_value(std::move(i)); // true}
出於右值引用定義的本質特徵以及某些對左值引用(常規引用)定義的修改,現在右值引用允許程式設計師提供函式參數的完美轉發。當與模板變參相結合時,這種能力可以允許函式模板完美地將參數轉發給接受那些參數的其他函式。這在轉發構造器參數時尤為有用:可以創建一些能自動調用具有相應參數構造器的工廠函式。C++語言一直具有常量表達式的概念。這些諸如3+4之類的表達式總是產生相同的結果且不具備副作用。常量表達式給編譯器帶來了最佳化的可能,而編譯器也經常在編譯期執行此類表達式並將結果存放在程式中。

相關詞條

熱門詞條

聯絡我們