std::move() 以及表達式到右邊值的轉換
std::move() 是C 語言中一個強大的函數,允許您將物件從一個位置移動到另一個位置而不複製它們。理解其實現可能具有挑戰性,但掌握其功能至關重要。
實作細節
MSVC 標準函式庫中 std::move() 的實作使用std::remove_reference 範本將表達式轉換為右邊值。它的工作原理如下:
template<class _Ty> inline typename tr1::_Remove_reference< _Ty >:: _Type& && move( _Ty && _Arg ) { return ((typename tr1::_Remove_reference< _Ty >:: _Type&&) _Arg); }
綁定到左值
當您將左值傳遞給std::move() 時,_Arg 引用參數會綁定到左值。但是,您不能直接將右值引用綁定到左值。為了解決這個問題,實作使用 std::static_cast 將左值轉換為右值參考。
理解 std::remove_reference
std::remove_reference 用於刪除來自類型的參考。這是它的實作:
template<class _Ty> struct _Remove_reference { typedef _Ty _Type; }; template<class _Ty> struct _Remove_reference< _Ty && > { typedef _Ty _Type; }; template<class _Ty> struct _Remove_reference< _Ty &&&&> { typedef _Ty _Type };
與右值一起使用
當使用右值呼叫std::move() 時,std::remove_reference 會T&& 轉換為T,導致以下函數模板實例化:
Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }
需要強制轉換,因為命名右值引用被視為左值。
與左值一起使用
當使用左值呼叫std::move() 時,std::remove_reference 會將T& 轉換為T ,產生下列函數模板實例化:
Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
參考折疊規則C 11 標準提供的允許Object& && 綁定到左值。結果函數有效地將左值參數轉換為右值參考。
結論
std::move() 利用 std::remove_reference 和引用折疊規則來允許將左值和右值轉換為右值參考。這可以實現高效的物件移動和記憶體使用的最佳化。
以上是`std::move()` 如何將 C 中的表達式轉換為右邊值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!