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?
Unfortunately, VS11 doesn't provide a default move constructor. See Move Semantics in the Remarks section - to quote: