2014-10-27 16 views
10

Byłem w stanie znaleźć wiele wątków na ten temat w przeszłości (np. here), ale takie rozmowy pochodzą sprzed dość dawna. Kod mam pytanie o to:Domyślny konstruktor przenoszenia w programie Visual Studio 2013 (aktualizacja 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)); 
} 

Jeśli wykonanie kodu w Visual Studio 2013 (aktualizacja 3), to wypisuje „kopiuj” dla obu przypadków. Jeśli standard nie zmienił się od czasu odpowiedzi w powyższym linku, wyjście powinno brzmieć "copy", a następnie "move". Ideone wydaje się dawać poprawne wyniki. Czy to po prostu coś, czego Visual Studio jeszcze nie zaimplementowało, czy jest coś czego brakuje w moim kodzie? I know that you cannot mark move constructors as default, ale to nie oznacza, że ​​kompilator nie obsługuje generowania domyślnych konstruktorów ruchu łącznie.

Odpowiedz

17

wiem, że nie można oznaczyć konstruktorów poruszają się domyślnie, ale to nie oznacza, że ​​kompilator nie obsługuje generowania domyślnie konstruktorzy przenieść wszystkie together

Niestety, to jest dokładnie to, co to znaczy. VS2013 nie obsługuje niejawnego generowania konstruktorów ruchu i przenoszenia operatorów przypisania. Jeśli tak, to naprawdę nie mieliby powodu, aby nie zezwalać na składnię = default, szczególnie, że jest to dozwolone dla konstruktora kopiowania i operatora przypisania.

Cytowanie MSDN: Support For C++11 Features (Modern C++)

„referencje rvalue v3.0” dodaje nowe reguły do ​​automatycznego generowania konstruktorów coraz szerzej operatorów przypisania pod pewnymi warunkami. Jednak nie jest to zaimplementowane w Visual C++ w Visual Studio 2013, ze względu na ograniczenia czasowe i zasobów.

+1

To rozczarowuje. Znalazłem także [ten wykres] (http://blogs.msdn.com/b/somasegar/archive/2013/06/28/cpp-conformance-roadmap.aspx), więc wygląda na to, że vNext powinien go zaimplementować. Wygląda na to, że mam teraz kod do modyfikacji ... – Duncan

+14

To jest do bani, jest do bani. –

+0

Wygląda na to, że nie zostanie on zaimplementowany w VS2015 ... –

Powiązane problemy