2014-12-21 20 views
5

Vorrei sapere quando il costruttore di movimento viene chiamato nel codice C++.Quando il costruttore di movimento viene chiamato

Significa che quando chiamo Foo a(b) è un costruttore di copie, quindi cosa devo fare per chiamare il costruttore di movimenti.

+0

Le risposte su [questa discussione SO] (http://stackoverflow.com/questions/3106110/what-is-move-semantics) vi aiuterà . – wakjah

risposta

4

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));.

+1

Nel tuo esempio di Foo a (b), 'b' è un oggetto con nome e quindi non può essere un valore. 'std :: move (b)' sarebbe richiesto qui. –

+0

@MichaelGazonda Sto trattando 'b' come un'espressione generale, non specificamente l'espressione' b'. Lo renderò più chiaro. –

3

In generale, dobbiamo dirlo dando un argomento di riferimento rvalue. Per esempio:

template<class T> 
void swap(T& a, T& b) 
{ 
    T tmp = std::move(a); 
    a = std::move(b); 
    b = std::move(tmp); 
} 

Il move() è una funzione standard di libreria di restituire un riferimento rvalue al suo argomento move(x) significa "mi dia un riferimento alla rvalue x". Cioè, std::move(x) non sposta nulla, invece, consente a un utente di spostare x.

Fonte: The C++ Programming Language (B. Stroustrup)

Problemi correlati