Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is this copy constructor called rather than the move constructor?

The following code snippet causes the copy constructor to be called where I expected the move constructor to be called:

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

On VS11 Beta, in debug mode, this prints:

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

I checked the standard and Bar seems to meet all requirements to have a default move constructor automatically generated, yet that doesn't seem to happen unless there's another reason why the object cannot be moved. I've seen a lot of move and copy constructor related questions around here but I don't think anyone has had this specific issue.

Any pointers on what's going on here? Is this standard behaviour?

like image 580
Trillian Avatar asked Apr 18 '12 01:04

Trillian


1 Answers

Unfortunately, VS11 doesn't provide a default move constructor. See Move Semantics in the Remarks section - to quote:

Unlike the default copy constructor, the compiler does not provide a default move constructor.

like image 112
Fraser Avatar answered Nov 15 '22 22:11

Fraser