首頁 >後端開發 >C++ >`std::move()` 如何實現 C 中左值到右值的轉換?

`std::move()` 如何實現 C 中左值到右值的轉換?

Linda Hamilton
Linda Hamilton原創
2024-11-21 08:14:09519瀏覽

How does `std::move()` achieve the conversion of lvalues to rvalues in C  ?

std::move 如何將表達式轉換為右邊值?

std::move() 有助於將表達式轉換為右值(右)值參考)以啟用移動語意。然而,MSVC 標準庫中的實作可能令人困惑。

實作如下:

template<class _Ty> inline
typename tr1::_Remove_reference<_Ty>::_Type&amp;&amp;
move(_Ty&amp;&amp; _Arg)
{ // forward _Arg as movable
    return ((typename tr1::_Remove_reference<_Ty>::_Type&amp;&amp;)_Arg);
}

讓我們示範一下它是如何運作的:

Object obj1;
Object obj2 = std::move(obj1); // _Ty&amp;&amp; _Arg binds to obj1

呼叫std::move(),_Arg 引用參數綁定到左值obj1。但是,由於不允許直接將右值引用綁定到左值,因此可能需要強制轉換為右值引用,例如 (Object&&)。

進一步深入研究 std:: 的實現remove_reference 澄清了問題:

template<class _Ty>
struct _Remove_reference
{ // remove reference
    typedef _Ty _Type;
};

template<class _Ty>
struct _Remove_reference<_Ty&amp;>
{ // remove reference
    typedef _Ty _Type;
};

template<class _Ty>
struct _Remove_reference<_Ty&amp;&amp;>
{ // remove rvalue reference
    typedef _Ty _Type;
};

此實現表明,remove_reference 將 T& 轉換為 T,T&& 轉換為 T,T&&&&&&&& 轉換為 T。因此,對於我們的情況,其中obj1 是Object 類型的左值,結果函數變成:

Object&amp;&amp; move(Object&amp; arg)
{
    return static_cast<Object&amp;&amp;>(arg);
}

進一步詳細說明:

  • 當使用右值呼叫move 時(例如std::move(Object())),T 變成Object,且結果函數是:
Object&amp;&amp; move(Object&amp;&amp; arg)
{
    return static_cast<Object&amp;&amp;>(arg);
}

轉換為Object&& 是必要的,因為命名右值引用被視為左值,而不允許從左值到右值引用的隱式轉換。

  • 當使用左值呼叫move 時,如我們前面的範例所示,T 變成Object&,結果函數為:
Object&amp;&amp; move(Object&amp; &amp;&amp; arg)
{
    return static_cast<Object&amp;&amp;>(arg);
}

這裡,C 11的引用折疊規則發揮作用並允許表達式Object& && 被解釋為Object&,一個左值引用,它確實可以綁定到左值。因此,最終函數將其參數轉換為右值引用並傳回它。

總之,std::move() 利用 std::remove_reference 來實現左值和右值都轉換為右值,從而方便移動C 中的語意。

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn