2013-02-09 24 views
8

Ho un oggetto simile al seguente e sto cercando di implementare un costruttore di spostamento per così puoi avere un inserto per std::vector<Mesh>.Sposta Constructor, sposta vettore tra due oggetti usando std :: move?

struct Mesh 
{  
    std::vector<Vector3> vPoint; 
    bool Valid; 

    Mesh(Mesh&& other) 
    { 
     vPoint = std::move(other.vPoint); 
     Valid = std::move(other.Valid); 
    } 
}; 

È il modo corretto? E se sì qual è il valore di other.Valid dopo std :: move opera su di esso?

Edit:

Anche se ho un'istanza di questo oggetto ho bisogno di usare std :: mossa nel seguente scenario?

std::vector<Mesh> DoSomething() 
{ 
    Mesh mesh; //Imagine vPoint is filled here to 

    std::vector<Mesh> meshes; 
    meshes.push_back(std::move(mesh)); // Here is my question, std::move? or just pass mesh here? 

    return meshes; 
} 
+1

Perché vuoi 'spostare' un' bool'? – us2012

+0

@ us2012 Sono solo curioso di sapere cosa succede con 'std :: move ' o altri tipi interi. Copia il valore su 'this.Valid' e poi imposta' other.Valid' sul valore predefinito di bool (aka false)? – NtscCobalt

risposta

9

si dovrebbe scrivere il costruttore mossa come segue:

Mesh(Mesh&& other) 
: vPoint(std::move(other.vPoint)) 
, Valid(std::move(other.Valid)) 
{} 

Lo svantaggio di cessione all'interno del corpo del costruttore in contrasto con la lista del costruttore di inizializzazione è che nel primo caso gli oggetti di membro dell'oggetto Mesh che ci si sta spostando su predefiniti costruiti e quindi assegnati all'interno del corpo. In quest'ultimo caso sono costruiti direttamente dal risultato della chiamata std::move.

Non si deve leggere da un oggetto, sia esso un tipo integrale o un oggetto più complesso, dopo averlo spostato. Tali oggetti esistono in uno stato non specificato.

+0

Ok grazie, ma cosa succede all'interno dell'operatore di Move Assignment? È 'vPoint = std :: move (other.vPoint)' appropriato? – NtscCobalt

+0

@NtscCobalt Sì, è – Praetorian

+0

Va bene, grazie. – NtscCobalt

3

(risposta parziale - rispondendo alla punta circa move ing bool)

cppreference.com ha il seguente da dire su std::move:

Il codice della libreria è necessario per lasciare un valore valido in argomento, ma a meno che il tipo o la funzione non documenti diversamente, non ci sono altri vincoli sul valore dell'argomento risultante. Ciò significa che è generalmente più saggio evitare di utilizzare nuovamente un argomento spostato da .

Così non si può contare su un bool essere o true o false dopo move ing esso.

+0

Ah ok grazie, dai test sembra che i tipi built-in non abbiano un costruttore di move così 'bool b = std :: move (other.b)' è fondamentalmente solo un compito. – NtscCobalt

+2

Un incarico soddisfa tutti i requisiti per una mossa e non sembra esserci alcun modo per migliorarlo. –

+0

@DavidSchwartz Sì, speravo in un avvertimento del compilatore o in un messaggio di posta elettronica che affermasse che std :: move() verrà declassato all'assegnazione solo quando nessun costruttore di movimenti è disponibile per il tipo. – NtscCobalt