¿Está unique_ptrgarantizado almacenar nullptrtras mudanza?
std::unique_ptr<int> p1{new int{23}};
std::unique_ptr<int> p2{std::move(p1)};
assert(!p1); // is this always true?
¿Está unique_ptrgarantizado almacenar nullptrtras mudanza?
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:y std::unique_ptr::release.
Respuestas:
Sí, puede compararlo con nullptrdespués del movey se garantiza que se comparará igual.
De §20.8.1 / 4 [unique.ptr]
Además,
upuede, previa solicitud, transferir la propiedad a otro puntero únicou2. Una vez completada dicha transferencia, se cumplen las siguientes condiciones posteriores:
-u2.pes igual a la pretransferenciau.p,
-u.pes igual anullptr, y
...
(el miembro pse describió anteriormente como: un puntero único es un objeto uque almacena un puntero a un segundo objetop )
p2{std::move(p1)}es mover la construcción p2de p1. Esa es la transferencia de propiedad solicitada en el texto que cité anteriormente. La implementación del constructor de movimientos se asegurará de que se cumplan todas las condiciones posteriores.
Si. De la sección 20.7.1 / 4 estándar de C ++ 2011 :
Además, puede, previa solicitud, transferir la propiedad a otro puntero único u2. Una vez completada dicha transferencia, las siguientes condiciones posteriores mantienen [...] [la fuente unique_ptr] es igual a nullptr ...
::movesale un elemento no está especificado. Tampoco creo que haya ninguna garantía en el extremo del puntero inteligente. Dicho esto, dejaré que los expertos del CPP respondan :)