次のコードスニペットは、私は移動コンストラクタが呼ばれることを期待どこコピーコンストラクタが呼び出されます:デバッグモードで、これは印刷し、VS11ベータ版で移動コンストラクタではなく、このコピーコンストラクタが呼び出されるのはなぜですか?
#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()); }
:
Foo gets built!
Foo gets copied!
Foo gets copied!
私がチェック標準とBar
は、デフォルトの移動コンストラクタを自動的に生成するためのすべての要件を満たしているようですが、オブジェクトが移動できない別の理由がない限り、発生しないようです。私はここで多くの移動とコピーコンストラクタに関連する質問を見ましたが、私は誰もこの特定の問題を抱えているとは思わない。
ここで何が起こっているのかについての指針はありますか?この標準的な振る舞いですか?
'return std :: move(bar);'は何かを変更しますか? BTW、gcc 4.7.0はコピーコンストラクタを呼び出します(コピーエリジョンはオフになっています)。 –
ところで、gcc 4.6.1は、コピーまたは移動のどちらの呼び出しもしません。 –
g ++ 4.5.3はオブジェクトを作成するだけです: "Fooはビルドされました!" (コピーエリミッション)、コピーエリミッションが無効の場合はオブジェクトを2回コピーします。右辺値がある場合にのみ移動コンストラクタが呼び出されますか?私はMeow()が適格であるかどうかは完全にはわかりません。 –