ホームページ > バックエンド開発 > C++ > C では、`std::move()` はどのように左辺値から右辺値への変換を実現するのでしょうか?

C では、`std::move()` はどのように左辺値から右辺値への変換を実現するのでしょうか?

Linda Hamilton
リリース: 2024-11-21 08:14:09
オリジナル
508 人が閲覧しました

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 が呼び出されたときrvalue (例: std::move(Object())) を使用すると、T は Object になり、その結果の関数になります。 is:
Object&amp;&amp; move(Object&amp;&amp; arg)
{
    return static_cast<Object&amp;&amp;>(arg);
}
ログイン後にコピー

名前付き右辺値参照は左辺値として扱われるため、Object&& へのキャストが必要ですが、左辺値から右辺値参照への暗黙的な変換は許可されません。

  • When前の例のように、move は lvalue で呼び出され、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 のセマンティクス。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート