Следующий фрагмент кода вызывает вызов конструктора копирования там, где я ожидал вызова конструктора перемещения:
#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()); }
В бета-версии VS11 в режиме отладки это печатает:
Foo gets built!
Foo gets copied!
Foo gets copied!
Я проверил стандарт и Bar
, кажется, удовлетворяет всем требованиям для автоматического создания конструктора перемещения по умолчанию, однако этого не происходит, если нет другой причины, по которой объект не может быть перемещен. Я видел здесь много вопросов, связанных с перемещением и копированием конструктора, но я не думаю, что у кого-то была эта конкретная проблема.
Любые указания на то, что здесь происходит? Это стандартное поведение?