2012-04-18 16 views
8

次のコードスニペットは、私は移動コンストラクタが呼ばれることを期待どこコピーコンストラクタが呼び出されます:デバッグモードで、これは印刷し、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は、デフォルトの移動コンストラクタを自動的に生成するためのすべての要件を満たしているようですが、オブジェクトが移動できない別の理由がない限り、発生しないようです。私はここで多くの移動とコピーコンストラクタに関連する質問を見ましたが、私は誰もこの特定の問題を抱えているとは思わない。

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

+0

'return std :: move(bar);'は何かを変更しますか? BTW、gcc 4.7.0はコピーコンストラクタを呼び出します(コピーエリジョンはオフになっています)。 –

+0

ところで、gcc 4.6.1は、コピーまたは移動のどちらの呼び出しもしません。 –

+0

g ++ 4.5.3はオブジェクトを作成するだけです: "Fooはビルドされました!" (コピーエリミッション)、コピーエリミッションが無効の場合はオブジェクトを2回コピーします。右辺値がある場合にのみ移動コンストラクタが呼び出されますか?私はMeow()が適格であるかどうかは完全にはわかりません。 –

答えて

8

残念ながら、VS11はデフォルトの移動コンストラクタを提供していません。備考セクションのMove Semanticsを参照してください - 引用する:

をデフォルトのコピーコンストラクタとは異なり、コンパイラは デフォルトムーブコンストラクタを提供していません。

+0

いいキャッチ、ありがとう!それは何とか標準によって許可されていますか?そうでない場合は、Microsoft Connectのバグをよく理解していなくても、私はMicrosoft Connectにバグをオープンします。 – Trillian

+0

MSは新しいC++ 11の機能のすべてをまだ実装していません。 http://msdn.microsoft.com/en-us/library/hh409293%28v=vs.110%29.aspxおよびhttp://blogs.msdn.com/b/vcblog/archive/2011/に詳しい情報があります。 09/12/10209291.aspx – Fraser

+0

最終的なVS11リリースのためのデフォルトの移動コンストラクタ生成を取得していない: – Trillian

関連する問題