Special member function generation



  • Habe in Meyers "effective C++" gelesen, dass die generation aller special member functions zukünftig unterbleibt, sobald eine der fünf definiert ist.

    Ist das in C++14 schon der Fall oder gilt immer noch, dass die Definition eines Copy ctor lediglich das move paar unterdrückt und umgekehrt?



  • kann das thema nochmal aufgegriffen werden?

    Wenn ich einen custom ctor, copy ctor und dtor habe, benötige ich dann?

    MyClass &operator=(const MyClass &) = delete;
    MyClass(MyClass &&) = delete;
    MyClass &operator=(MyClass &&) = delete;
    

    oder werden die sowieso nicht generiert?

    Meyers sagt, dass der assignment operator in dieser situation nicht automatisch generiert wird und die Generation der move functions unter dem neuen standard deprecated ist...



  • Ein Link zur Quelle wäre ganz hilfreich. Nicht dass ich dann was dazu sagen könnte, aber andere vielleicht.



  • "So move operations are generated for classes (when needed) only if these three things
    are true:
    • No copy operations are declared in the class.
    • No move operations are declared in the class.
    • No destructor is declared in the class.
    At some point, analogous rules may be extended to the copy operations, because
    C++11 deprecates the automatic generation of copy operations for classes declaring
    copy operations or a destructor."

    Scott meyers - effective modern C++ page 112



  • Meine Meinung dazu: in diesem Fall völlig egal.

    Wenn du gewisse Operationen nicht haben willst, schreib es explizit mit = delete hin. Dann ist es sofort jedem klar. Nach der Rule of 3/5 würde ich halt immer irgendwas für den operator= bzw. den copy-ctor erwarten. Entweder eine korrekte Implementierung oder eben ein =delete.

    Versuche aber eher Objekte zu bauen, die nach der Rule of zero funktionieren. Wobei du da aufpassen musst, falls du doch mal temporär einen Destruktor mit std::cout << "destruktor aufgerufen\n"; einbaust. Dann brauchst du noch ein =default für die dann fehlenden Operationen. Ja, ist nervig. Habe mir damit beim Debuggen schon mal in den Fuß geschossen.

    Aber ehrlich gesagt (finde ich) sollte man den Code verstehen können, ohne sich darüber Gedanken machen zu müssen. *Ich* würde diese Details eh vergessen und versuche daher, diese irgendwie zu umschiffen.

    Und wie es wirklich ist: das kannst du doch ganz schnell mit einer Beispielklasse ausprobieren. Geht vermutlich schneller als die Frage hier zu stellen 😉



  • pimpl kann aber zB die rule oh 0 nicht beachten ; )


  • Mod

    Zu deiner Frage: Das was er hier anspricht ist nun über drei Standardrevisionen (C++11, C++14, C++17) hinweg als deprecated aufgeführt, aber es ist nach wie vor alles beim alten.

    PS: Wie du auch selber in all diesen Sprachstandards hättest nachlesen können, entweder in Anhang D, wo alle Sachen aufgeführt sind, die deprecated sind, oder in den Kapiteln 12 (C++11, C++14) bzw. 15 (C++17), wo die implizite Definition gewisser Memberfunktionen beschrieben wird und explizit solche Sätze stehen:

    If the class definition does not explicitly declare a copy constructor, one is declared implicitly. If the class
    definition declares a move constructor or move assignment operator, the implicitly declared copy constructor
    is defined as deleted; otherwise, it is defined as defaulted (8.4). The latter case is deprecated if the class has
    a user-declared copy assignment operator or a user-declared destructor.


Anmelden zum Antworten