Конструктор перемещения по умолчанию в Visual Studio 2013 (обновление 3)
Я был в состоянии найти несколько разговоров об этом в прошлом (например, здесь), но такие разговоры произошли довольно давно. Код, по которому у меня есть вопрос:
#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), он печатает "копию" для обоих случаев. Если стандарт не изменился с момента ответа в приведенной выше ссылке, тогда вывод должен быть "копировать", а затем "двигаться". Кажется, что Ideone дает правильный вывод. Это просто что-то, что Visual Studio еще не реализовало, или в моем коде чего-то не хватает? Я знаю, что вы не можете пометить конструкторы перемещения по умолчанию, но это не означает, что компилятор не поддерживает генерацию конструкторов перемещения по умолчанию в целом.
1 ответ
Я знаю, что вы не можете пометить конструкторы перемещения по умолчанию, но это не означает, что компилятор не поддерживает генерацию конструкторов перемещения по умолчанию все вместе
К сожалению, это именно то, что это значит. VS2013 не поддерживает неявную генерацию конструкторов перемещения и операторов назначения перемещения. Если бы это было так, у них не было бы никаких оснований запрещать = default
синтаксис, тем более что вам разрешено делать это для конструктора копирования и оператора присваивания.
Цитирование MSDN: поддержка функций C++11 (современный C++)
"Rvalue Reference v3.0" добавляет новые правила для автоматической генерации конструкторов перемещения и операторов назначения перемещения при определенных условиях. Однако это не реализовано в Visual C++ в Visual Studio 2013 из-за нехватки времени и ресурсов.