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?
Czy 'return std :: move (bar);' zmienić coś? BTW, gcc 4.7.0 wywołuje konstruktor ruchu (z wyłączoną funkcją kopiowania). –
BTW, gcc 4.6.1 nie wywołuje ani kopii ani przeniesienia ctor. –
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ę. –