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