In append zu JaredPar Antwort
1-üblicher Ctor, 2.-Funktion-like-Ctor mit temporärem Objekt.
diese Quelle irgendwo Kompilieren hier http://melpon.org/wandbox/ mit verschiedenen Compilern
// turn off rvo for clang, gcc with '-fno-elide-constructors'
#include <stdio.h>
class Thing {
public:
Thing(const char*){puts(__FUNCTION__);}
Thing(const Thing&){puts(__FUNCTION__);}
~Thing(){puts(__FUNCTION__);}
};
int main(int /*argc*/, const char** /*argv*/) {
Thing myThing = Thing("asdf");
}
Und Sie werden sehen das Ergebnis.
Von ISO/IEC 14882 2003-10-15
8,5, Teil 12
Ihr erstes werden 2. Aufbau Direkt Initialisierung
12,1, Teil 13 genannt
Eine Konvertierung der funktionalen Notation (5.2.3) kann verwendet werden, um zu erstellen neue Objekte seines Typs. [Hinweis: Die Syntax sieht wie ein expliziter Aufruf des Konstruktors aus. ] ... Ein auf diese Weise erstelltes Objekt ist unbenannt. [Anmerkung: 12.2 beschreibt die Lebensdauer von temporären Objekten. ] [Hinweis: Explizite Konstruktoraufrufe ergeben keine lvalues, siehe 3.10.
]
Wo etwa RVO lesen:
12 Spezielle Mitgliederfunktionen/12.8 Kopieren von Klassenobjekten/Part 15
Wenn bestimmte Kriterien erfüllt sind, wird eine Implementierung erlaubt wegzulassen der Kopieraufbau eines Klassenobjekts, sogar, wenn der Kopierkonstruktor und/oder destructor für das Objekt hat Nebenwirkungen.
Schalten Sie es mit Compiler-Flag von Kommentar solche Kopie-Verhalten)
Jede Form ohne neu zu sehen. –
Das zweite Formular wird den Kopierkonstruktor verwenden, also nein, sie sind nicht gleichwertig. –
Ich spielte ein bisschen damit, der erste Weg scheint manchmal zu versagen, wenn Vorlagen mit parameterlosen Konstruktoren verwendet werden. – Nils