Markierung std :: unique_ptr class member als const

8

Viele Beispiele für die Verwendung von std::unique_ptr zur Verwaltung von Klassenabhängigkeiten sehen wie folgt aus:

%Vor%

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.

    
Peet Whittaker 07.09.2016, 13:07
quelle

3 Antworten

6

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.

    
Sombrero Chicken 07.09.2016, 13:26
quelle
1

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.

    
nwp 07.09.2016 13:27
quelle
1

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.

    
Toby Speight 08.09.2016 10:05
quelle