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
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.
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:
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.
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()
.
Die Version, die Sie verknüpfen, dient zum Übergeben von Konstruktorargumenten. Um den gewünschten Effekt zu erzielen, könnten Sie v.emplace_back();
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.