Гарантируется ли 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...