Synthezied Versions of Copy Control



  • Ich verstehe nicht, wieso ich "=default" verwenden soll, wenn der Compiler doch sowieso nicht vorhandene Copy Control Member automatisch generiert.

    We can explicitly ask the compiler to generate the synthesized versions of the
    copy-control members by defining them as = default:

    class Sales_data {
    public:
    // copy control; use defaults
    Sales_data() = default;
    Sales_data(const Sales_data&) = default;
    Sales_data& operator=(const Sales_data &);
    ~Sales_data() = default;
    // other members as before
    };
    Sales_data& Sales_data::operator=(const Sales_data&) = default;
    

    Kann mir jemand verrraten, was das für einen Zweck hat? Wenn ich zB nur den Copy Constructor explizit definiere, generiert der Compiler doch die anderen 4 member von sich aus



  • Sewing schrieb:

    Ich verstehe nicht, wieso ich "=default" verwenden soll,

    Wer sagt, dass du das verwenden sollst?

    Wenn du selber einen Copykonstruktor definieren musst, ist es sehr wahrscheinlich, dass du die default-Versionen nicht verwenden kannst. Siehe auch http://en.cppreference.com/w/cpp/language/rule_of_three

    Hier

    struct X
    {
            X(int){}
    //      X() = default;
    };
    
    int main()
    {
            X x;
    }
    

    ist ein Beispiel, bei dem default sinnvoll sein kann. Ausprobieren!



  • mir ist einfach nicht klar, wieso ich "=default" dahinter schreiben soll



  • Sewing schrieb:

    mir ist einfach nicht klar, wieso ich "=default" dahinter schreiben soll

    Das sollst du nur schreiben wenn du explizit die default-generierte Variante haben willst.

    zB wird kein Default-Ctor erstellt wenn du einen anderen Ctor erstellst. Mit default kannst du sagen "aber ich will trotzdem einen".



  • Ja aber dann kann ich den doch einfach deklarieren, ohne "=default" dahinterzuknallen. Was ist der Gewinn?



  • Es werden kein Default-Versionen des Move-Konstruktors und des Move-Zuweisungsoperator generiert, sobald explizt ein Copy-Konstruktor angegeben wird. Seit C++11 ist auch die Generierung einer Copy-Operation (bspw. Copy-Zuweisungsoperator) nicht mehr garantiert, wenn ein Destruktor oder ein andere Copy-Operation (bspw. Copy-Konstruktor) deklariert wird.

    Wenn dir also die Default-Varianten der jeweiligen "special member function" ausreichen und du gleichzeitig sicherstellen möchtest, dass diese tatsächlich generiert werden, so solltest du "= default" angeben.

    Das ist nicht der Weisheit letzter Schluss und wohl auch eine Geschmacksfrage. Für ein besseres Verständnis einfach mal nach "C++ Rule of Five" und "C++ Rule of Zero" suchen bzw. den Link von manni66 beachten.



  • Sewing schrieb:

    Ja aber dann kann ich den doch einfach deklarieren, ohne "=default" dahinterzuknallen. Was ist der Gewinn?

    Wenn du ihn (ohne "=default") deklarierst, musst du ihn auch definieren.* Denn sobald du (ohne "=default") deklarierst, generiert der Compiler den Copy-Konstruktor eben nicht mehr automatisch für dich.

    Die Alternative wäre alles wegzulassen, also auch die Deklaration.

    In deinem Beispiel geht das, da du, wenn du alles weglässt (Default-Ctor, Copy-Ctor, Assignment-Operatur und Destructor) durch nichts verhinderst dass alles automatisch generiert wird.
    Man kann es aber auch explizit anfordern. Genau das steht auch in dem von dir zitierten Text

    We can explicitly ask the compiler to generate the synthesized versions of the
    copy-control members by defining them as = default:

    *: Ausgenommen du willst ihn nirgends verwenden. Dann kannst du die Definition auch weglassen. Was soweit ich weiss sogar legal ist. Wirklich sinnvoll war das aber nur vor C++11, als Ersatz für "=delete".


Anmelden zum Antworten