C 11 理解 三 之 右值引用

2021-06-18 00:47:02 字數 1045 閱讀 5398

c++11 增加乙個新的非常數引用(reference)型別,稱作右值引用(r-value reference),標記為t &&。右值引用所引用的臨時物件可以在該臨時物件被初始化之後做修改,這是為了允許 move 語義。

c++03 效能上被長期被詬病的其中之一,就是其耗時且不必要的深度拷貝。深度拷貝會發生在當物件是以傳值的方式傳遞。舉例而言,std::vector 是內部儲存了 c-style 陣列的乙個包裝,如果乙個std::vector的臨時物件被建構或是從函式返回,要將其儲存只能通過生成新的std::vector並且把該臨時物件所有的資料複製進去。該臨時物件和其擁有的記憶體會被摧毀。(為了討論上的方便,這裡忽略返回值優化)

在 c++11,乙個std::vector的 "move 建構函式" 對某個vector的右值引用可以單純地從右值複製其內部 c-style 陣列的指標到新的 vector,然後留下空的右值。這個操作不需要陣列的複製,而且空的臨時物件的析構也不會摧毀記憶體。傳回vector臨時物件的函式不需要顯式地傳回std::vector&&。如果vector沒有 move 建構函式,那麼複製建構函式將被呼叫,以const std::vector&的正常形式。 如果它確實有 move 建構函式,那麼就會呼叫 move 建構函式,這能夠免除大幅的記憶體配置。

基於安全的理由,具名的引數將永遠不被認定為右值,即使它是被如此宣告的;為了獲得右值必須使用 std::move()。

bool is_r_value(

int&&

)bool is_r_value(

const

int&

)void test(

int&& i)

由於右值引用的用語特性以及對於左值引用(l-value references;regular references)的某些用語修正,右值引用允許開發者提供完美** (perfect function forwarding)。當與變長引數模板結合,這項能力允許函式模板能夠完美地轉送引數給其他接受這些特定引數的函式。最大的用處在於轉送構造函式引數,創造出能夠自動為這些特定引數呼叫正確建構式的工廠函式(factory function)。

C 11之 右值引用

最近在看cocos2dx的源 發現了乙個模板類有乙個奇怪的語法 inline refptr refptr other 剛開始一陣犯暈,乙個型別ref和乙個似乎是形參的other與操作會得出乙個什麼?顯然這種理解是錯誤的。還有一種含義是右值引用,表示形參是乙個右值。左值 右值 int a 0 a是乙個...

c 11新特性之右值引用

c 11 增加了乙個新的型別,稱為右值引用 r value reference 標記為 t 在介紹右值引用型別之前先要了解什麼是左值和右值。左值是指表示式結束後依然存在的持久物件,右值是指表示式結束時就不再存在的臨時物件。乙個區分左值與右值的便捷方法是 看能不能對表示式取位址,如果能,則為左值,否則...

C 11新特性之右值引用

右值 只能出現在operator 右邊的 通常臨時物件 將亡值 字面值常量 純右值 是右值 類的臨時物件是乙個右值,臨時變數一定被當成右值,因為臨時物件建立之後不會再被使用,所以直接把右值資料引用給別的變數,有時候乙個左值在後面不會被用到,那麼就可以使用move語義把左值轉成右值。右值引用和左值引用...