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.



  • This post is deleted!

Log in to reply