std::move() 對左值有何作用?
std::move() 是 C 語言中一個強大的工具,可以促進完美轉發。然而,乍一看,它的實施可能會引起一些人的注意。為了闡明 std::move() 如何實現這一點,讓我們深入研究其實現的複雜性。
理解「移動」函數
我們將從「move」函數範本的簡化版本:
template <typename T> typename remove_reference<T>::type&& move(T&& arg) { return static_cast<typename remove_reference<T>::type&&>(arg); }
情況1:傳遞右邊值
當使用右值呼叫std::move()時(臨時物件或計算結果為右值的表達式),移動模板實例化如下:
// move with [T = Object]: remove_reference<Object>::type&& move(Object&& arg) { return static_cast<remove_reference<Object>::type&&>(arg); }
Sinceremove_reference
Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }
如預期的那樣,該函數只是將其右值參數轉換為右值參考。
情況2:傳遞左值
現在,當使用左值(命名變數或計算結果為左值的表達式)來呼叫std::move()時,就會出現有趣的情況。
Object a; // a is lvalue Object b = std::move(a);
This此時,移動模板實例化為:
// move with [T = Object&] remove_reference<Object&>::type&& move(Object& && arg) { return static_cast<remove_reference<Object&>::type&&>(arg); }
再,remove_reference
Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
以上是std::move() 如何處理 C 中的左值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!