1. 程式人生 > >C++ 右值引用與移動操作

C++ 右值引用與移動操作

銷毀 帶來 臨時對象 類型 左值引用 都是 獲得 留下 c++11

右值引用和移動操作是C++11提出的新概念,通過這些操作,可以降低拷貝操作帶來的消耗。先來簡單介紹一下左值和右值。

左值一般指的是一個對象,或者說是一個持久的值,例如賦值的返回值、下標操作、解引用以及前置遞增等。

右值是一個短暫的值,比如一個表達式的求值結果、函數返回值以及一個字面值等。

為了區分,把一般的引用稱為左值引用,必須綁定到右值的引用稱為右值引用,以&&表示。右值引用有這兩個特性:

右值引用只能綁定到臨時對象,所引用的對象將要被銷毀,並且沒有其他用戶

這也意味著,我們可以自由地接管引用對象的資源。

通常一個變量可以認為是左值,也即是一個對象。那麽如何獲得右值呢?可以顯示轉換為對應的右值引用,也可以調用標準庫函數std::move()。

move()承諾了我們不再使用移後源,不保證移後源的狀態和值。

實際上,移動操作竊取了對象資源的控制權,從而避免了不必要的拷貝。

int i = 1;
int&& rr = std::move(i);

移後源對象必須是可以析構的,並且要保證對象依然有效,可以被賦予新值,但是不保證移後源對象中留下的值。

事實上,單純調用std::move()並不會對對象進行改變,只有另外一個對象接管了資源後,移動才真正完成。

<<C++ primer>>在模板操作中詳細解釋了std::move的具體實現和工作。

template<typename T> typename remove_reference<T>::type&& move(T&& t)
{
    
return static_cast<typename remove_reference<T>::type&&> (t); }

move的參數是一個T&&,而任何有名字的參數實際上都是左值。也就是說,這個參數可以和任何類型的參數匹配,可以傳左值也可以傳右值。

C++ 右值引用與移動操作