Aufruf des Move-Konstruktors
-
Hallo,
kann mir jemand erklären, warum der Move-Konstruktor bei diesem Code nicht aufgerufen wird?#include <iostream> #include <string> using namespace std; class A { public: // default constructor A() : s("default") {} // copy constructor A(const A& o) { cout << "move failed!\n"; } // move constructor A(A&& o) { cout << "Move Constructor!!"<<endl; } private: string s; }; A temp() { A a; return a; } int main() { A b = temp(); return 0; }
Die Funktion temp erzeugt eine neues Objekt, das temporär ist und weisst es einem neuen Objekt zu. Eigentlich muss der Move Konstruktor bei der Rückgabe von a aus der Funktion temp aufgerufen werden. Oder nicht?
-
Das zurückgegebene Objekt wird direkt an der Stelle von
b
konstruiert, es ist kein move-Konstruktor notwendig.Hier steht eine ganze Menge dazu: https://blog.tartanllama.xyz/guaranteed-copy-elision/
-
Scheint an dem Compiler zu liegen. In MS VS 2019 wird der Move-Konstruktor ausgeführt. In http://cpp.sh/ wird der Move-Konstruktor nicht ausgeführt.
-
@asd1
Beim gcc kann man den Aufruf der ausgelassenen Move- bzw. Copy-Konstruktoren mit dem Schalter-fno-elide-constructors
erzwingen.
-
Dieser Beitrag wurde gelöscht!