Wird garantiert, dass unique_ptr nach dem Verschieben nullptr speichert?


78

Wird unique_ptrgarantiert nullptrnach dem Umzug gespeichert ?

std::unique_ptr<int> p1{new int{23}};
std::unique_ptr<int> p2{std::move(p1)};
assert(!p1); // is this always true?

2
Technisch ist der Zustand, in dem ::moveein Element verbleibt, nicht spezifiziert. Ich glaube auch nicht, dass es eine Garantie für das Ende des Smart Pointers gibt. Das heißt, ich überlasse es den CPP-Experten zu antworten :)
Benjamin Gruenbaum

1
Warten Sie, egal, ja. Release setzt es explizit auf nullptr. Dies wird von derunique_ptr
Benjamin Gruenbaum

gcc 4.8.1 hier ist p1 null nach dem std :: move
Exceptyon


Schauen Sie sich nur die Bewegungssemantik an ...
Deduplicator

Antworten:


70

Ja, Sie können es nullptrnach dem vergleichen moveund es wird garantiert gleich verglichen.

Aus §20.8.1 / 4 [unique.ptr]

Darüber hinaus ukann auf Anfrage das Eigentum auf einen anderen eindeutigen Zeiger übertragen werden u2. Nach Abschluss einer solchen Übertragung gelten folgende Nachbedingungen:
- u2.pist gleich der Vorübertragung u.p,
- u.pist gleichnullptr und
...

(Das pElement wurde früher beschrieben als - ein eindeutiger Zeiger ist ein Objekt u, das einen Zeiger auf ein zweites Objekt speichertp )


Dies gilt eindeutig nach dem Aufruf von release (). Aber std :: move ruft nicht release () auf. Woher weiß der Compiler, dass er die Invariante von unique_ptr wiederherstellen kann?
Mabraham

1
@mabraham p2{std::move(p1)}bewegt sich p2aus p1. Dies ist die beantragte Eigentumsübertragung in dem oben zitierten Text. Die Implementierung des Verschiebungskonstruktors stellt sicher, dass alle Nachbedingungen erfüllt sind.
Prätorianer

Vielen Dank. Umformulierung: Die Verwendung des Verschiebungskonstruktors erfordert die Übertragung des Eigentums, und dies muss die Invariante von p1 beibehalten. std :: move ermöglicht nur die Verwendung des Verschiebungskonstruktors.
Mabraham

10

Ja. Aus C ++ 2011 Standard Abschnitt 20.7.1 / 4 :

Zusätzlich können Sie auf Anfrage das Eigentum an einen anderen eindeutigen Zeiger u2 übertragen. Nach Abschluss einer solchen Übertragung gelten die folgenden Nachbedingungen: [...] [die Quelle unique_ptr] ist gleich nullptr ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.