Warum ruft vector.emplace_back den move-Konstruktor auf?

8
%Vor%

Dies gibt mir die folgende Ausgabe:

  

Konstruktor
  Konstruktor verschieben

Warum? Ich dachte, dass emplace_back das Objekt an Ort und Stelle erstellt, so dass keine Kopier- oder Verschiebungskonstruktoren dies tun müssen genannt werden.
Aus der Beschreibung:

  

Das Element wird vor Ort konstruiert, d. h. es werden keine Kopier- oder Verschiebeoperationen ausgeführt.

BEARBEITEN: Ah, okay, anscheinend habe ich emplace_back () falsch verstanden. Sie müssen das Objekt nicht als Argument haben, da es automatisch für Sie erstellt wird. Sie müssen die Argumente für den Object-Konstruktor nur an emplace_back () übergeben.

Also, wenn ich einen neuen Konstruktor wie folgt hätte:

%Vor%

Ich würde emplace_back wie folgt aufrufen:

%Vor%

statt dessen:

%Vor%

Macht jetzt Sinn, vielen Dank!

EDIT2: Ich wünschte, ich könnte alle deine Antworten akzeptieren! :-P

    
gartenriese 18.02.2014, 15:29
quelle

5 Antworten

15

emplace_back leitet seine Argumente an den Konstruktor der Vektorelementklasse weiter, die an der nächsten verfügbaren Position von vector in-place aufgerufen wird.

%Vor%

entspricht einer Art:

%Vor%

Aus diesem Grund erhalten Sie einen regulären Konstruktoraufruf gefolgt von einem Move-Konstruktoraufruf. Wenn Sie ein neues Objekt mit emplace_back anhängen möchten, rufen Sie einfach:

%Vor%

Nur der Vollständigkeit halber ist ein weiterer Grund, warum emplace_back einen Verschiebungskonstruktor aufrufen könnte: emplace_back kann dazu führen, dass vector wächst und somit den ursprünglichen Inhalt an ihren neuen Speicherort verschiebt. Dies ist nicht das Problem hier, weil reserve genügend Kapazität garantiert, aber im Allgemeinen ist es eine Antwort auf die Frage.

    
Martin J. 18.02.2014, 15:32
quelle
9

v.emplace_back(Object{}); ruft ein neues new (place) Object(Object{}) auf, also einen Move-Konstruktor.

Verwenden Sie v.emplace_back(); , um den Aufruf eines zusätzlichen Objektkonstruktors zu vermeiden was zu new (place) Object;

führt     
Jarod42 18.02.2014 15:33
quelle
5

emplace_back ruft den Konstruktor auf, der mit den übergebenen Argumenten übereinstimmt. In diesem Fall haben Sie Object{} übergeben, was dem Konstruktor Object&& move entspricht.

Wenn in der Beschreibung "keine Verschiebung oder Kopie" angegeben ist, bedeutet dies neben der von Ihnen angegebenen Objektkonstruktion. Wenn diese Konstruktion eine Bewegung oder eine Kopie ist, wird sie natürlich ausgeführt.

Wenn emplace_back den no-args-Konstruktor verwenden soll, übergeben Sie ihm keine Argumente: v.emplace_back() .

    
Steve Jessop 18.02.2014 15:36
quelle
3

Die Version, die Sie verknüpfen, dient zum Übergeben von Konstruktorargumenten. Um den gewünschten Effekt zu erzielen, könnten Sie v.emplace_back();

aufrufen     
François Moisan 18.02.2014 15:31
quelle
1

Sie rufen emplace_back mit einem Objekt des gleichen Typs auf, das im Vektor gespeichert ist, so dass Sie eine Kopie dieses Objekts anfordern (identisch mit Object O(Object{}); ). Da Sie ein temporäres bereitstellen, wird der Verschiebungskonstruktor anstelle des Kopierkonstruktors aufgerufen.

    
TNA 18.02.2014 15:35
quelle

Tags und Links