「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > std::move() は C++ で左辺値をどのように処理しますか?

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

2024 年 11 月 13 日に公開
ブラウズ:827

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

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

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

「移動」関数を理解する

まず始めます。 「move」関数テンプレートの簡易バージョン:

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

ケース 1: 右辺値を渡す

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

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

remove_reference はオブジェクトをオブジェクトに変換するため、次のようになります。

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

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

ケース 2: 左辺値を渡す

ここで興味深いのが、このケースは、 std::move() が左辺値 (名前付き変数、または左辺値に評価される式) を使用して呼び出されたときに発生します。 // a は左辺値です Object b = std::move(a);

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

// [T = Object&] で移動します Remove_reference::type&& move(Object& && arg) { return static_cast::type&&>(arg); }

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

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

Object&& move(Object& && arg) { return static_cast(arg); }
参照の折りたたみ

の概念が導入され、参照構文の解釈が変更されます。

Object & & = Object &
  • Object & & && = オブジェクト &
  • オブジェクト & && & = オブジェクト &
  • オブジェクト & && & && = オブジェクト & &&
  • これらのルールでは、Object& && は実質的に Object& として動作します。

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

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

Object&& move(Object& arg) { return static_cast(arg); }
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3