8

次のコード スニペットでは、移動コンストラクターが呼び出されると予想していた場所で、コピー コンストラクターが呼び出されます。

#include <cstdio>

struct Foo
{
    Foo() { puts("Foo gets built!"); }
    Foo(const Foo& foo) { puts("Foo gets copied!"); }
    Foo(Foo&& foo) { puts("Foo gets moved!"); }
};

struct Bar { Foo foo; };
Bar Meow() { Bar bar; return bar; }
int main() { Bar bar(Meow()); }

VS11 ベータ版のデバッグ モードでは、次のように表示されます。

Foo gets built!
Foo gets copied!
Foo gets copied!

標準を確認したところBar、デフォルトの移動コンストラクターを自動的に生成するためのすべての要件を満たしているようですが、オブジェクトを移動できない別の理由がない限り、それは発生しないようです。ここでは、移動およびコピー コンストラクターに関連する多くの質問を見てきましたが、この特定の問題を抱えている人はいないと思います。

ここで何が起こっているかについての指針はありますか?これは標準的な動作ですか?

4

1 に答える 1

8

残念ながら、VS11 には既定の移動コンストラクターが用意されていません。備考セクションの移動セマンティクスを参照してください-引用するには:

既定のコピー コンストラクターとは異なり、コンパイラは既定の移動コンストラクターを提供しません。

于 2012-04-18T01:53:41.600 に答える