move constructor und deleted copy constructor



  • Hi,

    struct A
    {
    	A(int n) {}
    	A(const A& a) = delete;
    };
    
    int main()
    {
    	A b = A(5);
    }
    
    // g++ -std=c++0x -O0 main.cc -o main
    

    Funktioniert natürlich nicht:

    error: use of deleted function ‘A::A(const A&)’
    

    Wenn ich nun auch den move constructor definiere, dann funktionierts wieder:

    #include <iostream>
    using namespace std;
    
    struct A
    {
    	A(int n) {}
    	A(const A& a) = delete;
            A(A&& a) { cout << "move" << endl; }
    };
    
    int main()
    {
    	A b = A(4);
    }
    
    // g++ -std=c++0x -O0 main.cc -o main
    

    Aber...Eine move Ausgabe auf der Konsole sehe ich nicht. Irgendwas scheine ich noch nicht ganz richtig verstanden zu haben und move geschieht dennoch auf magische Weise.



  • Der Compiler darf die Temporary eliminieren, sobald ein passender Copy/Move-Ctor vorhanden ist.



  • Kellerautomat schrieb:

    Der Compiler darf die Temporary eliminieren, sobald ein passender Copy/Move-Ctor vorhanden ist.

    Ok danke. Ich dachte das könnte ich mit -O0 irgendwie ausschließen.



  • -fno-elide-constructors

    Ich seh' zwar keinen Sinn in diesem Schalter, aber wenn es nur zu Testzwecken ist ...



  • Super 👍


Anmelden zum Antworten