Почему вызывается этот конструктор копирования, а не конструктор перемещения?

Следующий фрагмент кода вызывает вызов конструктора копирования там, где я ожидал вызова конструктора перемещения:

#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, кажется, удовлетворяет всем требованиям для автоматического создания конструктора перемещения по умолчанию, однако этого не происходит, если нет другой причины, по которой объект не может быть перемещен. Я видел здесь много вопросов, связанных с перемещением и копированием конструктора, но я не думаю, что у кого-то была эта конкретная проблема.

Любые указания на то, что здесь происходит? Это стандартное поведение?

8
задан Trillian 18 April 2012 в 01:42
поделиться