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&& move(Object& && arg) { return static_cast<Object&&>(arg); }
左辺値を渡しているため、一見すると、これは直観に反しているように見えます。ただし、C 11 では、参照の折りたたみの概念が導入され、参照構文の解釈が変更されます。
これらのルールでは、Object& && は事実上、左辺値にバインドできる通常の左辺値参照である Object& として動作します。
したがって、関数の最終形式は次のようになります:
Object&& move(Object& arg) { return static_cast<Object&&>(arg); }
In本質的に、 std::move() は左辺値引数を右辺値参照にキャストし、入力の型に関係なく完全転送を可能にします。
以上がstd::move() は C で左辺値をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。