ホームページ  >  記事  >  バックエンド開発  >  std::move() は C で左辺値をどのように処理しますか?

std::move() は C で左辺値をどのように処理しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-14 14:46:02347ブラウズ

How Does std::move() Handle Lvalues in C  ?

std::move() は左辺値に何をしますか?

std::move() は、Lvalue を容易にするための C の強力なツールです。完璧な転送。しかし、その実装は一見すると眉をひそめるかもしれません。 std::move() がこれをどのように実現するかを明確にするために、その実装の複雑さを掘り下げてみましょう。

「Move」関数を理解する

まず始めます。 「move」関数の簡易版template:

template <typename T>
typename remove_reference<T>::type&& move(T&& arg)
{ return static_cast<typename remove_reference<T>::type&&>(arg); }

ケース 1: 右辺値を渡す

std::move() が右辺値 (一時オブジェクトまたは評価する式) を指定して呼び出された場合右辺値に変換)、移動テンプレートは次のようにインスタンス化されます。

// move with [T = Object]:
remove_reference<Object>::type&& move(Object&& arg)
{ return static_cast<remove_reference<Object>::type&&>(arg); }

削除_参照<オブジェクト> Object を Object に変換すると、次のようになります。

Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }

予想どおり、関数は単に右辺値引数を右辺値参照にキャストするだけです。

ケース 2: 左辺値を渡す

さて、std::move() が次のように呼び出された場合に興味深いケースが発生します。左辺値 (名前付き変数、または左辺値に評価される式)。

Object a; // a is lvalue
Object b = std::move(a);

今回、移動テンプレートは次のようにインスタンス化します。

// move with [T = Object&]
remove_reference<Object&>::type&& move(Object& && arg)
{ return static_cast<remove_reference<Object&>::type&&>(arg); }

再び、remove_reference Object& を ​​Object に変換すると、次のようになります。

Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }

左辺値を渡しているため、一見すると、これは直観に反しているように見えます。ただし、C 11 では、参照の折りたたみの概念が導入され、参照構文の解釈が変更されます。

  • Object & & = Object &
  • Object & & && = オブジェクト &
  • オブジェクト & && & = オブジェクト&
  • Object & && & && = Object & &&

これらのルールでは、Object& && は事実上、左辺値にバインドできる通常の左辺値参照である Object& として動作します。

したがって、関数の最終形式は次のようになります:

Object&& move(Object& arg) { return static_cast<Object&&>(arg); }

In本質的に、 std::move() は左辺値引数を右辺値参照にキャストし、入力の型に関係なく完全転送を可能にします。

以上がstd::move() は C で左辺値をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。