Ich habe dies ursprünglich nur als Frage zu Destruktoren gepostet, aber jetzt füge ich die Berücksichtigung des Standardkonstruktors hinzu. Hier ist die ursprüngliche Frage:
Wenn ich meiner Klasse einen Destruktor geben möchte, der virtuell ist, aber ansonsten dem entspricht, was der Compiler generieren würde, kann ich Folgendes verwenden
=default
:class Widget { public: virtual ~Widget() = default; };
Aber es scheint, dass ich mit weniger Eingabe mit einer leeren Definition den gleichen Effekt erzielen kann:
class Widget { public: virtual ~Widget() {} };
Gibt es eine Art und Weise, wie sich diese beiden Definitionen unterschiedlich verhalten?
Basierend auf den Antworten auf diese Frage scheint die Situation für den Standardkonstruktor ähnlich zu sein. Gibt es angesichts der Tatsache, dass es für Destruktoren fast keinen Bedeutungsunterschied zwischen " =default
" und " {}
" gibt, in ähnlicher Weise fast keinen Bedeutungsunterschied zwischen diesen Optionen für Standardkonstruktoren? Angenommen, ich möchte einen Typ erstellen, in dem die Objekte dieses Typs sowohl erstellt als auch zerstört werden, warum sollte ich dann sagen?
Widget() = default;
anstatt
Widget() {}
?
Ich entschuldige mich, wenn die Erweiterung dieser Frage nach der ursprünglichen Veröffentlichung gegen einige SO-Regeln verstößt. Das Posten einer fast identischen Frage für Standardkonstruktoren schien mir die weniger wünschenswerte Option zu sein.
std::has_trivial_destructor<Widget>::value
ist es true
für den ersten, aber false
für den zweiten. Was die Auswirkungen davon sind, weiß ich auch nicht. :)
= default
ist expliziter imo und stimmt mit der Unterstützung durch Konstruktoren überein.