Move Constructor predefinito in Visual Studio 2013 (aggiornamento 3)

Sono stato in grado di trovare più conversazioni su questo in passato (ad esempio qui ), ma tali conversazioni provengono da un po ‘di tempo fa. Il codice su cui ho una domanda è:

#include  #include  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 (aggiornamento 3), viene stampato “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? So che non è ansible contrassegnare come predefiniti i costruttori di movimenti , ma ciò non implica che il compilatore non supporti generatori di movimento predefiniti nel loro insieme.

So che non è ansible contrassegnare come predefiniti i costruttori di mosse, ma ciò non implica che il compilatore non supporti la generazione di costruttori di movimento di default tutti insieme

Sfortunatamente, questo è esattamente ciò che significa. VS2013 non supporta la generazione implicita di costruttori di movimento e gli operatori di spostamento delle posizioni. Se lo facesse, non avrebbero davvero un motivo per disabilitare la syntax = default , specialmente perché è permesso farlo per il costruttore di copia e l’operatore di assegnazione.

Citando MSDN: supporto per le caratteristiche di C ++ 11 (Modern C ++)

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