2013-02-09 19 views
8

Ich habe ein Objekt wie folgt und ich versuche, einen Move-Konstruktor zu implementieren, so dass Sie eine Einfügung für std::vector<Mesh> haben können.Konstruktor verschieben, Vektor mit std :: move zwischen zwei Objekten verschieben

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

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

Ist das der richtige Weg? Und wenn ja, was ist der Wert von other.Valid nach std :: move funktioniert darauf?

Edit:

Auch wenn ich eine Instanz dieses Objekt haben muss ich std :: Umzug im folgenden Szenario benutzen?

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

Warum möchten Sie '' bool' 'bewegen? – us2012

+0

@ us2012 Ich bin nur neugierig, was passiert mit 'std :: move ' oder anderen integrierten Typen. Kopiert er den Wert in 'this.Valid' und setzt' other.Valid' auf den Standardwert von bool (aka false)? – NtscCobalt

Antwort

9

Sie sollten Ihren Umzug Konstruktor wie folgt schreiben:

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

Der Nachteil der Zuordnung innerhalb des Konstruktorrumpf im Gegensatz den Konstruktor Initialisiererliste zu verwenden ist, dass im ersten Fall die Mitgliedsobjekte des Mesh Objekt, das Sie bewegen sich zu sind standardmäßig konstruiert und dann innerhalb des Körpers zugewiesen. Im letzteren Fall werden sie direkt aus dem Ergebnis des Aufrufs std::move konstruiert.

Sie sollten nicht von einem Objekt lesen, sei es ein ganzzahliger Typ oder ein komplexeres Objekt, nachdem Sie es verschoben haben. Solche Objekte existieren in einem nicht spezifizierten Zustand.

+0

Ok danke, aber was ist mit dem Move Assignment Operator? Ist 'vPoint = std :: move (other.vPoint) 'geeignet? – NtscCobalt

+0

@NtscCobalt Ja, es ist – Praetorian

+0

In Ordnung danke. – NtscCobalt

3

(Teilantwort - die Beantwortung der Spitze über move ing bool)

cppreference.com hat folgendes zu sagen über std::move:

Der Bibliothekscode benötigt einen gültigen Wert in der verlassen Argument, , aber wenn der Typ oder die Funktion nichts anderes dokumentiert, gibt es keine weiteren Einschränkungen für den resultierenden Argumentwert. Dies bedeutet, dass es im Allgemeinen am weisesten ist, ein verschobenes from Argument nicht zu verwenden.

So verlassen Sie können nicht auf einem bool entweder true oder false nach move ing es zu sein.

+0

Ah ok danke, aus dem Test scheint es, dass integrierte Typen keinen Move-Konstruktor haben, also 'bool b = std :: move (other.b)' ist im Grunde nur eine Aufgabe. – NtscCobalt

+2

Eine Aufgabe erfüllt alle Anforderungen für einen Umzug und es gibt keine Möglichkeit, sie zu verbessern. –

+0

@DavidSchwartz Ja, ich hatte auf eine Compiler-Warnung oder etc gehofft, die besagt, dass std :: move() nur dann zur Zuweisung zurückgestuft wird, wenn kein move-constructor für den Typ verfügbar ist. – NtscCobalt

Verwandte Themen