2012-04-18 11 views
8

Poniższy kod wywołuje konstruktor kopia nazywać gdzie spodziewałem konstruktor ruch na miano:Dlaczego ten konstruktor kopiowania jest wywoływany, a nie konstruktor ruchu?

#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()); } 

Na VS11 Beta, w trybie debugowania, to drukuje:

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

Sprawdziłem standard i Bar wydaje się spełniać wszystkie wymagania, aby automatycznie wygenerować domyślny konstruktor ruchu, ale wydaje się, że to się nie zdarza, chyba że istnieje inny powód, dla którego obiekt nie może zostać przeniesiony. Widziałem tutaj wiele pytań dotyczących konstruktora ruchu i kopiowania, ale nie sądzę, by ktokolwiek miał ten konkretny problem.

Jakieś wskazówki na temat tego, co się tutaj dzieje? Czy to standardowe zachowanie?

+0

Czy 'return std :: move (bar);' zmienić coś? BTW, gcc 4.7.0 wywołuje konstruktor ruchu (z wyłączoną funkcją kopiowania). –

+0

BTW, gcc 4.6.1 nie wywołuje ani kopii ani przeniesienia ctor. –

+0

g ++ 4.5.3 tworzy tylko obiekt: "Foo zostaje zbudowany!" (copy elision), natomiast wyłączenie kopiowania powoduje dwukrotne skopiowanie obiektu. Czy konstruktor ruchu nie jest wywoływany tylko wtedy, gdy masz wartość r? Nie jestem całkowicie pewien, że Meow() kwalifikuje się. –

Odpowiedz

8

Niestety, VS11 nie zapewnia domyślnego konstruktora ruchu. Zobacz Move Semantics w sekcji Uwagi - zacytować:

przeciwieństwie do domyślnego konstruktora kopii, kompilator nie dostarcza konstruktora domyślnego przenoszenia.

+0

Fajny połów, dzięki! Czy jest to w jakiś sposób dozwolone przez standard? Jeśli nie, to chyba otworzę błąd w Microsoft Connect, mimo że muszą być tego świadomi. – Trillian

+0

MS nie ukończyło jeszcze implementacji wszystkich nowych funkcji C++ 11. Więcej informacji można znaleźć pod adresem http://msdn.microsoft.com/en-us/library/hh409293%28v=vs.110%29.aspx i http://blogs.msdn.com/b/vcblog/archive/2011/ 09/12/10209291.aspx – Fraser

+0

Cholera, nie otrzymujemy nawet domyślnego generatora generowania ruchu dla ostatecznego wydania VS11: / – Trillian

Powiązane problemy