58

移動コンストラクターを持つ派生オブジェクトがあり、基本オブジェクトにも移動セマンティクスがある場合、派生オブジェクト移動コンストラクターから基本オブジェクト移動コンストラクターを呼び出す適切な方法は何ですか?

最初に最も明白なことを試しました:

 Derived(Derived&& rval) : Base(rval)
 { }

ただし、これは Base オブジェクトのコピー コンストラクターを呼び出すことになるようです。次にstd::move、次のようにここで明示的に使用してみました。

 Derived(Derived&& rval) : Base(std::move(rval))
 { }

これはうまくいきましたが、なぜそれが必要なのか混乱しています。std::move右辺値参照を返すだけだと思いました。しかし、この例rvalではすでに右辺値参照であるため、 への呼び出しは不要std::moveです。ただし、ここで使用しない場合std::moveは、コピー コンストラクターを呼び出すだけです。では、なぜ への呼び出しがstd::move必要なのですか?

4

3 に答える 3

52

rvalは右辺値ではありません。これは、移動コンストラクターの本体内の左辺値です。そのため、明示的に呼び出す必要がありstd::moveます。

これを参照してください。重要な注意事項は、

上記の引数 x は、右辺値参照パラメーターとして宣言されていても、move 関数内部の左辺値として扱われることに注意してください。そのため、基本クラスに渡すときに、単に x ではなく move(x) と言う必要があります。これは、名前付き変数から誤って 2 回移動することを防ぐために設計された移動セマンティクスの重要な安全機能です。すべての移動は、右辺値からのみ、または std::move を使用するなどの右辺値への明示的なキャストによってのみ発生します。変数の名前がある場合、それは左辺値です。

于 2010-11-03T12:01:44.437 に答える
-5

std::move(obj) ではなく std::forward(obj) を使用する必要があります。Forward は、obj が何であるかに基づいて適切な右辺値または左辺値を返しますが、move は左辺値を右辺値に変換します。

于 2011-02-01T18:48:22.273 に答える