右值引用

右值引用,更多是一種規範,是程序員和編譯器的協作。

右值引用的使用,是編譯器允許程序員直接訪問臨時變量(你用右值引用,編譯器也常規認爲其是臨時的,會很快被銷燬的對象,可能實際並不是,可能是左值轉換過來的),

並不是你用了右值引用,就能直接得到效率的提升的,需要你定義移動構造函數甚至是移動賦值函數,在函數內部,你可以獲取得到訪問臨時變量的能力,而不是通過拷貝得到,

你可以將該臨時變量的資源竊取到你新的對象內部(即指針的重新指向),意思是既然你用右值引用,那麼該對象就應該是臨時對象,會很快被銷燬。

但是這種很快被銷燬只是我們商議規定的,這完全取決於你的對象的類型,和你是否後續代碼中有直接銷燬不再使用的操作,僅僅是規定商議,並不是編譯器你編寫了右值引用,編譯器就能直接幫你竊取資源,僅僅是你用右值引用,即在傳遞參數等臨時變量的時候,其會通過移動構造函數傳遞給你,你能直接訪問,而如何竊取是由你決定,而函數調用結束後,也不會自動幫你銷燬你傳遞的變量(取決於你變量本身的生命週期),僅僅是按規定你用右值引用,那麼該傳遞的所謂臨時變量後續就不應該使用,因爲其內部的資源很可能已經被竊取。


簡略意義:

1.有能力獲取訪問臨時變量的能力,const T&常量左值也有

2.讓編譯器區分開拷貝語義(資源拷貝)和移動語義(資源竊取),可分離出兩種不同邏輯方法的實現,保證了單一指責

3.而這控制拷貝還是移動,交由業務方(程序員)來指定。


相關函數:

std::move作用:將一個任意類型的值強制轉換爲右值。

使用場景:如果你現在爲類編寫了拷貝構造函數和移動構造函數,那麼對於一個左值,可能你想將它交由容器保存,但是自己本身不會再對該引用進行直接使用,均是通過容器來獲取,那麼你添加到容器後,其實你這個引用對象和內部資源會被銷燬,並且容器內部使用的是拷貝構造函數,那麼你可能想讓編譯器對左值進行右值引用的移動語義,便可以使用該函數,將傳遞給容器的參數變爲右值引用,那麼編譯器便會按照移動語義來執行,但是記住,只是臨時改變傳遞參數的引用類型,本身引用的類型並沒有改變,是否銷燬還是由引用本身類型決定。


注:

int &&a = 3; //意思是a是一個能夠綁定臨時變量的引用(右值引用),是一種編譯器賦予的能力,但是a本身是一個引用了,後續的作爲其他參數使用的時候,是作爲左值使用的

參考文章:http://m.blog.csdn.net/shujh_sysu/article/details/52029072

發佈了139 篇原創文章 · 獲贊 26 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章