」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > std::move() 如何處理 C++ 中的左值?

std::move() 如何處理 C++ 中的左值?

發佈於2024-11-13
瀏覽:727

How Does std::move() Handle Lvalues in C  ?

std::move() 對左值有何作用?

std::move() 是 C 語言中一個強大的工具,用於促進完美轉發。然而,乍一看,它的實施可能會引起一些人的注意。為了闡明 std::move() 如何實現這一點,讓我們深入研究其實現的複雜性。

理解「移動」函數

我們將從「move」函數範本的簡化版本:

template 
typename remove_reference::type&& move(T&& arg)
{ return static_cast::type&&>(arg); }

情況1:傳遞右邊值

當使用右值(暫時物件或計算結果為右值的表達式)呼叫std::move() 時,移動模板實例化如下:

// move with [T = Object]:
remove_reference::type&& move(Object&& arg)
{ return static_cast::type&&>(arg); }

由於remove_reference將Object轉換為Object,我們最終得到:

Object&& move(Object&& arg) { return static_cast(arg); }

如預期的那樣,該函數只是將其右值參數轉換為右值引用。

情況2:傳遞左值

現在,有趣的是當使用左值(命名變數或計算結果為左值的表達式)呼叫std:: move() 時,就會出現這種情況。

Object a; // a is lvalue
Object b = std::move(a);

這次,移動模板實例化為:

// move with [T = Object&]
remove_reference::type&& move(Object& && arg)
{ return static_cast::type&&>(arg); }

同樣,remove_reference 將Object& 轉換為Object,結果是:

Object&& move(Object& && arg) { return static_cast(arg); }

乍一看,這似乎違反直覺,因為我們傳遞了一個左值。然而,C 11引入了引用折疊的概念,它修改了引用語法的解釋:

  • Object & & = Object &
  • Object & & && = Object &
  • Object & && & = Object &
  • Object & && & && = Object & &&

在這些規則下,Object& && 實際上表現為 Object& ,一個可以綁定到左值的普通左值引用。

因此,函數的最終形式變為:

Object&& move(Object& arg) { return static_cast(arg); }

本質上,std ::move() 將左值參數轉換為右值引用,因此無論輸入類型如何都能實現完美轉送。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3