Конструктор перемещения по умолчанию в 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 из-за нехватки времени и ресурсов.

Другие вопросы по тегам