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

來源:互聯網
上載者:User

標籤:簡單   拷貝   移動   strong   概念   style   表示   臨時對象   函數   

右值引用和移動操作是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++ 右值引用與移動操作

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.