2014-10-27 2 views
10

Мне удалось найти несколько разговоров об этом в прошлом (например, here), но такие разговоры происходят довольно давно. Код у меня есть вопрос о том:По умолчанию 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 (Update 3), он печатает «копировать» в обоих случаях. Если стандарт не изменился после ответа в приведенной выше ссылке, тогда выход должен быть «копией», за которой следует «переместить». Идеал, кажется, дает правильный результат. Является ли это тем, что Visual Studio еще не реализовала, или что-то не хватает в моем коде? I know that you cannot mark move constructors as default, но это не означает, что компилятор не поддерживает генерацию конструкторов перемещения по умолчанию.

ответ

17

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

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

Цитирования MSDN: Support For C++11 Features (Modern C++)

«RValue ссылка v3.0» добавляет новые правила для автоматической генерации перемещения конструкторов и перемещения операторов присваивания при определенных условиях. Однако это не реализовано в Visual C++ в Visual Studio 2013 из-за ограничений времени и ресурсов.

+1

Это неутешительно. Я также нашел [этот график] (http://blogs.msdn.com/b/somasegar/archive/2013/06/28/cpp-conformance-roadmap.aspx), поэтому он выглядит так: vNext должен реализовывать его. Похоже, у меня есть код, который нужно изменить сейчас ... – Duncan

+14

Это отстой, сосет сосет. –

+0

Похоже, что он не будет реализован в VS2015 либо ... –

Смежные вопросы