Viele Beispiele für die Verwendung von std::unique_ptr
zur Verwaltung von Klassenabhängigkeiten sehen wie folgt aus:
Meine Frage ist, ob das _child
Mitglied als const
irgendwelche unerwarteten Nebenwirkungen hat? (Abgesehen davon, dass sichergestellt wird, dass reset()
, release()
usw. nicht am _child
aufgerufen werden können).
Ich frage, da ich es noch nicht in einem Beispiel gesehen habe und nicht, ob das beabsichtigt ist oder nur aus Gründen der Kürze / Allgemeingültigkeit.
Aufgrund der Art von std::unique_ptr
(alleiniger Besitz eines Objekts) muss kein Kopierkonstruktor vorhanden sein. Der move -Konstruktor (6) nimmt nur nicht-konstante rvalue-Referenzen, was bedeutet, dass, wenn Sie ' Ich versuche, Ihr _child
const
zu machen und es zu verschieben, Sie würden einen schönen Kompilierungsfehler bekommen:)
Selbst wenn eine benutzerdefinierte unique_ptr
eine const rvalue-Referenz verwenden würde, wäre es unmöglich dies zu implementieren.
Die Nachteile sind wie bei jedem const
-Member: Die Zuweisungs- und Bewegungszuweisungsoperatoren funktionieren nicht richtig (sie müssten _child
überschreiben), und das Verschieben vom Elternteil würde nicht den% co_de stehlen % (Leistungsfehler) Es ist auch ungewöhnlich, Code wie diesen zu schreiben, möglicherweise verwirrende Leute.
Der Gewinn ist geringfügig, da _child
_child
ist und daher nur innerhalb von private
zugegriffen werden kann. Daher ist die Menge an Code, die Invarianten umwandeln kann, um Parent
zu ändern, auf Mitgliederfunktionen und Freunde beschränkt die sowieso Invarianten beibehalten müssen.
Ich kann mir eine Situation nicht vorstellen, in der der Gewinn die Nachteile überwiegen würde, aber wenn Sie das tun, können Sie es auf Ihre Art und Weise tun, ohne andere Teile des Programms zu zerstören.
Ja, Sie können das tun, und das mache ich regelmäßig, wenn ich UI-Klassen in Qt implementiere:
%Vor% Es ist genau vergleichbar mit dem Schreiben von Ui::MyWidget *const ui
in C ++ 03-Code.
Der obige Code erzeugt ein neues Objekt, aber es gibt keinen Grund, keinen mit std::move()
wie in der Frage zu übergeben.
Tags und Links c++ c++11 smart-pointers unique-ptr ownership