Гарантируется ли unique_ptr сохранение nullptr после перемещения?
Является ли unique_ptr гарантией сохранение nullptr после перемещения?
std::unique_ptr<int> p1{new int{23}};
std::unique_ptr<int> p2{std::move(p1)};
assert(!p1); // is this always true?
Ответ 1
Да, вы можете сравнить его с nullptr после move, и гарантированно сравнить его.
Из §20.8.1/4 [unique.ptr]
Кроме того, u может, по запросу, передать право собственности другому уникальному указателю u2. По завершении такой передачи соблюдаются следующие постусловия: - u2.p равно предварительной передаче u.p, - u.p равно nullptr и ...
(член p описан ранее как — уникальный указатель - это объект u, который хранит указатель на второй объект p)
Ответ 2
Да. Из С++ 2011 Standard Section 20.7.1/4:
Кроме того, вы можете, по запросу, передать право собственности другому уникальному указателю u2. По завершении такой перенос, следующие постусловии сохраняются [...] [источник unique_ptr] равен nullptr...