std::move() 對左值有何作用?
std::move() 是 C 語言中一個強大的工具,用於促進完美轉發。然而,乍一看,它的實施可能會引起一些人的注意。為了闡明 std::move() 如何實現這一點,讓我們深入研究其實現的複雜性。
理解「移動」函數
我們將從「move」函數範本的簡化版本:
templatetypename remove_reference ::type&& move(T&& arg) { return static_cast ::type&&>(arg); }
情況1:傳遞右邊值
當使用右值(暫時物件或計算結果為右值的表達式)呼叫std::move() 時,移動模板實例化如下:
// move with [T = Object]: remove_reference
由於remove_reference
Object&& move(Object&& arg) { return static_cast
如預期的那樣,該函數只是將其右值參數轉換為右值引用。
情況2:傳遞左值
現在,有趣的是當使用左值(命名變數或計算結果為左值的表達式)呼叫std:: move() 時,就會出現這種情況。
Object a; // a is lvalue Object b = std::move(a);
這次,移動模板實例化為:
// move with [T = Object&] remove_reference
同樣,remove_reference
Object&& move(Object& && arg) { return static_cast
乍一看,這似乎違反直覺,因為我們傳遞了一個左值。然而,C 11引入了引用折疊的概念,它修改了引用語法的解釋:
在這些規則下,Object& && 實際上表現為 Object& ,一個可以綁定到左值的普通左值引用。
因此,函數的最終形式變為:
Object&& move(Object& arg) { return static_cast
本質上,std ::move() 將左值參數轉換為右值引用,因此無論輸入類型如何都能實現完美轉送。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3