std::move 如何將表達式轉換為右邊值?
std::move() 有助於將表達式轉換為右值(右)值參考)以啟用移動語意。然而,MSVC 標準庫中的實作可能令人困惑。
實作如下:
template<class _Ty> inline typename tr1::_Remove_reference<_Ty>::_Type&& move(_Ty&& _Arg) { // forward _Arg as movable return ((typename tr1::_Remove_reference<_Ty>::_Type&&)_Arg); }
讓我們示範一下它是如何運作的:
Object obj1; Object obj2 = std::move(obj1); // _Ty&& _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&> { // remove reference typedef _Ty _Type; }; template<class _Ty> struct _Remove_reference<_Ty&&> { // remove rvalue reference typedef _Ty _Type; };
此實現表明,remove_reference 將 T& 轉換為 T,T&& 轉換為 T,T&&&&&&&& 轉換為 T。因此,對於我們的情況,其中obj1 是Object 類型的左值,結果函數變成:
Object&& move(Object& arg) { return static_cast<Object&&>(arg); }
進一步詳細說明:
Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }
轉換為Object&& 是必要的,因為命名右值引用被視為左值,而不允許從左值到右值引用的隱式轉換。
Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
這裡,C 11的引用折疊規則發揮作用並允許表達式Object& && 被解釋為Object&,一個左值引用,它確實可以綁定到左值。因此,最終函數將其參數轉換為右值引用並傳回它。
總之,std::move() 利用 std::remove_reference 來實現左值和右值都轉換為右值,從而方便移動C 中的語意。
以上是`std::move()` 如何實現 C 中左值到右值的轉換?的詳細內容。更多資訊請關注PHP中文網其他相關文章!