Мне удалось найти несколько разговоров об этом в прошлом (например, здесь), но такие разговоры происходят довольно давно. Код, о котором я задаю, это:
#include <utility>
#include <iostream>
struct Foo
{
Foo() = default;
Foo(const Foo &o)
{
std::cout << "copy" << std::endl;
}
Foo(Foo &&o)
{
std::cout << "move" << std::endl;
}
};
struct Bar
{
Foo foo;
};
int main(void)
{
Bar a;
Bar b(a);
Bar c(std::move(a));
}
Если вы выполняете код в Visual Studio 2013 (обновление 3), он печатает "копию" для обоих случаев. Если стандарт не изменился после ответа в приведенной выше ссылке, тогда выход должен быть "копией", за которой следует "переместить". Идеал, кажется, дает правильный результат. Является ли это тем, что Visual Studio еще не реализовала, или что-то не хватает в моем коде? Я знаю, что вы не можете пометить конструкторы перемещения по умолчанию, но это не означает, что компилятор не поддерживает создание конструкторов перемещения по умолчанию в совокупности.