Wird unique_ptr
garantiert nullptr
nach 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_ptr
garantiert nullptr
nach 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 nullptr
nach dem vergleichen move
und es wird garantiert gleich verglichen.
Aus §20.8.1 / 4 [unique.ptr]
Darüber hinaus
u
kann auf Anfrage das Eigentum auf einen anderen eindeutigen Zeiger übertragen werdenu2
. Nach Abschluss einer solchen Übertragung gelten folgende Nachbedingungen:
-u2.p
ist gleich der Vorübertragungu.p
,
-u.p
ist gleichnullptr
und
...
(Das p
Element 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 p2
aus 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 ...
::move
ein 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 :)