¿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?
c++
c++11
move-semantics
unique-ptr
lizarisk
fuente
fuente
::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 :)unique_ptr
std::unique_ptr::operator:
ystd::unique_ptr::release
.Respuestas:
Sí, puede compararlo con
nullptr
después delmove
y se garantiza que se comparará igual.De §20.8.1 / 4 [unique.ptr]
(el miembro
p
se describió anteriormente como: un puntero único es un objetou
que almacena un puntero a un segundo objetop
)fuente
p2{std::move(p1)}
es mover la construcciónp2
dep1
. 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 :
fuente