2014-10-27 11 views
10

Sono stato in grado di trovare più conversazioni su questo in passato (ad esempio here), ma tali conversazioni provengono da un po 'di tempo fa. Il codice Ho una domanda circa è:Costruttore di spostamento predefinito in Visual Studio 2013 (Update 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)); 
} 

Se si esegue il codice in Visual Studio 2013 (Update 3), esso stampa "copia" per entrambi i casi. Se lo standard non è cambiato dopo la risposta nel link sopra, allora l'output dovrebbe essere "copy" seguito da "move". Ideone sembra dare l'output corretto. È solo qualcosa che Visual Studio non ha ancora implementato, o c'è qualcosa che manca nel mio codice? I know that you cannot mark move constructors as default, ma ciò non implica che il compilatore non supporti generatori di movimento predefiniti nel loro insieme.

risposta

17

So che non è possibile contrassegnare i costruttori muoversi come impostazione predefinita, ma ciò non implica che il compilatore non supporta la generazione di costruttori di spostare predefiniti tutto insieme

Purtroppo, questo è esattamente ciò che significa. VS2013 non supporta la generazione implicita di costruttori di movimento e gli operatori di spostamento delle posizioni. Se così fosse, non avrebbero davvero un motivo per non consentire la sintassi = default, soprattutto perché è consentito farlo per il costruttore di copia e l'operatore di assegnazione.

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

"riferimenti rvalue v3.0" aggiunge nuove regole per generare automaticamente i costruttori di movimento e spostare gli operatori di assegnazione a determinate condizioni. Tuttavia, questo non è implementato in Visual C++ in Visual Studio 2013, a causa di limiti di tempo e risorse.

+1

Questo è deludente. Ho anche trovato [questo grafico] (http://blogs.msdn.com/b/somasegar/archive/2013/06/28/cpp-conformance-roadmap.aspx), quindi sembra che vNext dovrebbe averlo implementato. Sembra che io abbia del codice da modificare subito ... – Duncan

+14

Questo schifo fa schifo. –

+0

Sembra che non verrà implementato in VS2015 ... –

Problemi correlati