¿Está unique_ptr
garantizado almacenar nullptr
tras 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_ptr
garantizado almacenar nullptr
tras 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 nullptr
después del move
y se garantiza que se comparará igual.
De §20.8.1 / 4 [unique.ptr]
Además,
u
puede, previa solicitud, transferir la propiedad a otro puntero únicou2
. Una vez completada dicha transferencia, se cumplen las siguientes condiciones posteriores:
-u2.p
es igual a la pretransferenciau.p
,
-u.p
es igual anullptr
, y
...
(el miembro p
se describió anteriormente como: un puntero único es un objeto u
que almacena un puntero a un segundo objetop
)
p2{std::move(p1)}
es mover la construcción p2
de 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 ...
::move
sale 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 :)