Чи гарантовано unique_ptr зберігати nullptr після переміщення?


78

Є чи 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?

2
Технічно стан, в якому ::moveзалишається елемент, не визначений. Я не думаю, що на кінці розумного вказівника також є гарантія. Тим не менш, я залишу відповідь експертам CPP :)
Бенджамін Груенбаум

1
Зачекайте, неважливо, так. Release явно встановлює для нього значення nullptr. Це гарантуєunique_ptr
Бенджамін Груенбаум

gcc 4.8.1 тут, p1 має значення null після std :: move
Exceptyon

1
Див. Будь-які посилання на std::unique_ptr::operator:та std::unique_ptr::release.
rubenvb

просто подивіться на семантику переміщення ...
Deduplicator

Відповіді:


70

Так, ви можете порівняти його з nullptrпісля moveі гарантовано порівняти рівним.

З §20.8.1 / 4 [unique.ptr]

Крім того, uза запитом може передати право власності на інший унікальний покажчик u2. Після завершення такої передачі виконуються наступні умови:
- u2.pдорівнює попередній передачі u.p,
- u.pдорівнюєnullptr і
...

(член pописаний раніше як - унікальний покажчик - це об'єкт, uщо зберігає вказівник на другий об'єктp )


Це явно вірно після виклику release (). Але std :: move не викликає release (). Тож як знає компілятор, щоб відновити інваріант унікального_ptr?
mabraham

1
@mabraham p2{std::move(p1)}- це побудова p2з p1. Це запитувана передача права власності в тексті, який я цитував вище. Реалізація конструктора переміщення забезпечить виконання всіх постумов.
Преторіан

Дякую. Перефразовуючи: використання конструктора переміщення вимагає передачі права власності, і це повинно підтримувати інваріант p1. std :: move просто дозволяє використовувати конструктор переміщення.
mabraham

10

Так. Зі стандартного розділу C ++ 2011 20.7.1 / 4 :

Крім того, u може за запитом передати право власності на інший унікальний покажчик u2. По завершенні такої передачі, наступні післяумови мають [...] [джерело unique_ptr] дорівнює nullptr ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.