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?
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?
unique_ptr
std::unique_ptr::operator:und std::unique_ptr::release.
Antworten:
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 werdenu2. Nach Abschluss einer solchen Übertragung gelten folgende Nachbedingungen:
-u2.pist gleich der Vorübertragungu.p,
-u.pist gleichnullptrund
...
(Das pElement wurde früher beschrieben als - ein eindeutiger Zeiger ist ein Objekt u, das einen Zeiger auf ein zweites Objekt speichertp )
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.
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 ...
::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 :)