Є чи 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?
Є чи 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?
unique_ptr
std::unique_ptr::operator:та std::unique_ptr::release.
Відповіді:
Так, ви можете порівняти його з nullptrпісля moveі гарантовано порівняти рівним.
З §20.8.1 / 4 [unique.ptr]
Крім того,
uза запитом може передати право власності на інший унікальний покажчикu2. Після завершення такої передачі виконуються наступні умови:
-u2.pдорівнює попередній передачіu.p,
-u.pдорівнюєnullptrі
...
(член pописаний раніше як - унікальний покажчик - це об'єкт, uщо зберігає вказівник на другий об'єктp )
p2{std::move(p1)}- це побудова p2з p1. Це запитувана передача права власності в тексті, який я цитував вище. Реалізація конструктора переміщення забезпечить виконання всіх постумов.
::moveзалишається елемент, не визначений. Я не думаю, що на кінці розумного вказівника також є гарантія. Тим не менш, я залишу відповідь експертам CPP :)