Є чи 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 :)