首頁 > 後端開發 > C++ > std::move() 如何處理 C 中的左值?

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

Mary-Kate Olsen
發布: 2024-11-14 14:46:02
原創
412 人瀏覽過

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

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& 轉換為Object,結果是:

Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
登入後複製
將Object& 轉換為Object,結果是:

乍一看,這似乎違反直覺,因為我們傳遞了一個左值。然而,C 11引入了

引用折疊
    的概念,它修改了引用語法的解釋:
  • Object & & = Object &
  • Object & & & && = Object &
  • Object & && & = Object &
Object & && & && = Object & &&

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

Object&& move(Object& arg) { return static_cast<Object&&>(arg); }
登入後複製
因此,函數的最終形式變為:

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

以上是std::move() 如何處理 C 中的左值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板