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 に変換します。その結果、次の関数テンプレートが生成されますinstantiation:
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 と参照の折りたたみルールを利用して、左辺値と右辺値の両方を右辺値参照に変換します。これにより、オブジェクトの効率的な移動とメモリ使用量の最適化が可能になります。
以上がC の `std::move()` は式を右辺値にどのように変換しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。