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?
Lizarisk
quelle
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
1
Siehe alle Verweise auf std::unique_ptr::operator:und std::unique_ptr::release.
Rubenvb
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 )

Prätorianer
quelle
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 ...

Paul Evans
quelle