在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之類的表達式總是產生相同的結果且不具備副作用。常量表達式給
編譯器帶來了最佳化的可能,而編譯器也經常在編譯期執行此類表達式並將結果存放在程式中。