rule of five und virtual destructor
-
@booster sagte in rule of five und virtual destructor:
Ist ja nur ein Hilfsmittel um eine Klasse als Abstract zu kennzeichnen wenn sie sonst keine Member hat die man als rein virtuell kennzeichnen kann.
Aber nochmals was ist mit den copy und move operations?
Copy und move-Zeugs musst du nicht definieren wenn du den Dtor eh als= default
implementierst.
Die Regel existiert ja nur weil es wahrscheinlich ist dass, wenn man in einem der grossen 5 etwas anderes macht als default wäre, in den restlichen 4 vermutlich auch etwas anderes braucht. Da= default
aber nix anders macht als default...
Ich würde einfach mal sagen die Warning sollte bei= default
vermutlich überhaupt nicht anschlagen.EDIT: Siehe Korrekturen weiter unten.
-
@hustbaer sagte in rule of five und virtual destructor:
Copy und move-Zeugs musst du nicht definieren wenn du den Dtor eh als = default implementierst.
AFAIK gilt das als benutzerdefinierter Destruktor und verhindert somit das automatische Erzeugen von Move.
-
@hustbaer sagte in rule of five und virtual destructor:
Ich würde einfach mal sagen die Warning sollte bei = default vermutlich überhaupt nicht anschlagen.
Jo das wäre eigentlich korrekt. Aber resharper zeigt halt trozdem eine. Blöd
-
Die Warnung weißt sogar darauf hin das der destructor default ist.
class '...' defines a default destructor but does not define a copy constructor, a copy assignment operator, a move constructor or a move assignment operator
-
die Warnung verweist hier her:
und diese wiederum hier her:
-
@booster Und wie wäre es mit lesen, was in dem Verweis steht?
Z.B. das hier:
Declaring any special member function except a default constructor, even as =default or =delete, will suppress the implicit declaration of a move constructor and move assignment operator
-
Ich habe das gelesen. Aber was willst du mir damit sagen?
-
@booster Ich will dir sagen, dass der resharper recht hat.
-
Ja das hat manni ja auch geschreiben.
Sprich ich muss in einem interface (also abstracte basisklasse) alle move und copy operations einfügen auch wenn nur als default gekennzeichnet. Das war ja die Ausgangsfrage.
-
Du hast Recht, sorry dass ich Unsinn geschrieben habe.
Die Frage ist allerdings ob man überhaupt will dass Klassen die ein Interface implementieren per Default move- und copyable sind.
-
@hustbaer sagte in rule of five und virtual destructor:
Die Frage ist allerdings ob man überhaupt will dass Klassen die ein Interface implementieren per Default move- und copyable sind.
Wieso das hat ja nichts miteinander zu tun.
Aber ich muss zwingend im interface alle opertionen aufführen. Ob ich sie nun implementiere, als default oder als deleted kennzeichne. Nun ja finde ich nicht schön/übersichtlich.
-
@booster sagte in rule of five und virtual destructor:
Wieso das hat ja nichts miteinander zu tun.
Theoretisch ja. Oft ist es aber so dass Objekte die von abstrakten Interface-Klassen erben gar nicht kopierbar sein sollten.
Aber ich muss zwingend im interface alle opertionen aufführen. Ob ich sie nun implementiere, als default oder als deleted kennzeichne. Nun ja finde ich nicht schön/übersichtlich.
Nur wenn du alle verfügbar haben willst. Wenn du dagegen alle
=delete
haben willst reicht es entweder den Move-Ctor oder den Move-Assignment-Operator=delete
zu machen.