Copy-Konstruktor wird nicht aufgerufen. RVO?
-
Hi.
Ich frage mich warum bei meinem Code der Copy-Konstruktor nicht aufgerufen wird:#include <iostream> class Foo { public: Foo() { std::cout << "Konstruktor" << std::endl; } ~Foo() { std::cout << "Destruktor" << std::endl; } Foo(const Foo& f) { std::cout << "Copy-Konstruktor" << std::endl; } }; Foo createFoo() { return Foo(); } int main() { Foo f = createFoo(); }
Wenn ich den Copy-Konstruktor private mache dann kann er es nicht kompilieren. Aufgerufen wird er aber nicht. Nur einmal Konstruktur und einmal Destruktor. Ich dachte das könnte was mit der Return Value Optimization zu tun haben. Aber ich hab eigentlich die Optimierungen ganz abgeschaltet. Kann es sein das der Compiler (MinGW) trotzdem optimiert hat? Oder hat das gar nichts mit RVO zu tun?
-
Foo foo = createFoo (); // initialisierung; der konstruktor wird aufgerufen foo = createFoo () // zuweisung; der copy-konstruktor wird aufgerufen
was auch immer
-
wird bei :
foo = createFoo();
nicht der Zuweisungsoperator aufgerufen ?
Ich glaube der Fehler liegt darin das createFoo() kein Objekt ist.
Darum wird bei:Foo foo = createFoo();
kein Kopierkonstruktor aufgerufen.
-
klausel schrieb:
wird bei :
foo = createFoo();
nicht der Zuweisungsoperator aufgerufen ?
In diesem Fall ja, da foo bereits existiert.
-
Eindeutig RVO.
-
Schönen Dank.
Warum macht die Compiler das denn wenn man Optimierungen ausschaltet? Visual C++ macht es nämlich auch. Das ist ja eine Frechheit.
-
Vielleicht, weil es technisch gesehen eine andere Klasse von Optimierung ist. Normale Optimierungen verändern das beobachtbare Verhalten eines Programms nicht, RVO schon.