std::move() は左辺値に何をしますか?
std::move() は、C の強力なツールです。完璧な転送。しかし、その実装は一見すると眉をひそめるかもしれません。 std::move() がこれをどのように実現するかを明確にするために、その実装の複雑さを掘り下げてみましょう。
「移動」関数を理解する
まず始めます。 「move」関数テンプレートの簡易バージョン:
templatetypename remove_reference ::type&& move(T&& arg) { return static_cast ::type&&>(arg); }
ケース 1: 右辺値を渡す
右辺値 (一時オブジェクトまたは右辺値に評価される式) を使用して std::move() が呼び出された場合、移動テンプレートは次のようにインスタンス化されます:
// move with [T = Object]: remove_reference
remove_reference
Object&& move(Object&& arg) { return static_cast
予想どおり、関数は右辺値引数を右辺値参照にキャストするだけです。
ケース 2: 左辺値を渡す
ここで興味深いのが、このケースは、 std::move() が左辺値 (名前付き変数、または左辺値に評価される式) を使用して呼び出されたときに発生します。 // a は左辺値です Object b = std::move(a);
Object a; // a is lvalue Object b = std::move(a);
// [T = Object&] で移動します Remove_reference
// move with [T = Object&] remove_reference
Object&& move(Object& && arg) { return static_cast
Object&& move(Object& && arg) { return static_cast参照の折りたたみ
の概念が導入され、参照構文の解釈が変更されます。
Object & & = Object &したがって、関数の最終形式は次のようになります。
Object&& move(Object& arg) { return static_cast
Object&& move(Object& arg) { return static_cast
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3