右值引用(及其支持的移動語義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}