Подтвердить что ты не робот

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

4b9b3361

Ответ 1

Я знаю, что вы не можете пометить конструкторы перемещения по умолчанию, но это не означает, что компилятор не поддерживает создание конструкторов перемещения по умолчанию вместе

К сожалению, это именно то, что это значит. VS2013 не поддерживает неявное генерирование конструкторов перемещения и переводит операторы присваивания. Если бы это было так, у них действительно не было бы причины запрещать синтаксис = default, тем более, что вам разрешено делать это для конструктора копирования и оператора присваивания.

Цитата MSDN: Поддержка возможностей С++ 11 (современный С++)

"Rvalue references v3.0" добавляет новые правила для автоматического создания конструкторов перемещения и перемещения операторов присваивания при определенных условиях. Однако это не реализовано в Visual С++ в Visual Studio 2013 из-за ограничений времени и ресурсов.