Un costruttore di spostamenti è solo un altro costruttore. Se si sono sovraccaricati i costruttori, proprio come avere sovraccaricato altre funzioni, la scelta di quale costruttore viene chiamato dipende dalle regole della risoluzione di sovraccarico. Cioè, quando costruisci un oggetto con Foo a(<some-expression>);
, potrebbero esserci più costruttori possibili e uno deve essere scelto.
Il costruttore di copie accetta un argomento di tipo const Foo&
. Questo tipo di riferimento lvalue si associa a qualsiasi espressione che denoti un oggetto . Il costruttore di movimento accetta un argomento di tipo Foo&&
. Questo riferimento rvalue si collegherà solo ai rvalue modificabili. In effetti, questo sovraccarico sarà preferito nel caso di passaggio di un valore modificabile.
Ciò significa che in Foo a(<some-expression>);
se l'espressione <some-expression>
è un valore modificabile, verrà scelto il costruttore di movimento. Altrimenti viene scelto il costruttore della copia. I rvalue modificabili appaiono di solito quando si denotano oggetti temporanei (ad esempio, un oggetto restituito da una funzione). È anche possibile forzare un'espressione a un'espressione rvalue utilizzando std::move
, ad esempio Foo a(std::move(b));
.
fonte
2014-12-21 21:23:21
Le risposte su [questa discussione SO] (http://stackoverflow.com/questions/3106110/what-is-move-semantics) vi aiuterà . – wakjah