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 のセマンティクス。
以上がC では、`std::move()` はどのように左辺値から右辺値への変換を実現するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。