Почему observer_ptr
обнуляется после операции перемещения?
Он правильно установлен на nullptr
в своей конструкции по умолчанию, и это имеет смысл (и предотвращает указание на мусор).
И, соответственно, он должен обнуляться при std::move()
'd from, так же как и std::string
, std::vector
и т.д.
Это сделало бы его хорошим кандидатом в нескольких контекстах, где необработанные указатели имеют смысл, а также для автоматического создания операций перемещения в классах с элементами данных необработанных указателей, например в в этом случае.
ИЗМЕНИТЬ
Как отметил @JonathanWakely в комментариях (и это связано с вышеупомянутым вопросом):
если
observer_ptr
было нулевым после перемещения, его можно использовать для реализации правила нуля для типов, которые имеют член-указатель. Это очень полезная функция.
observer_ptr
выглядит самым нелепым предложением, которое я когда-либо видел. - person user541686   schedule 11.03.2014nullptr
. - person Mr.C64   schedule 11.03.2014unique_ptr
,unique_lock
иfuture
, вам абсолютно необходимо полагаться на значение, с которого было перемещено, иначе вы получите несколько владельцев! Для пользовательских типов с указателями, не принадлежащими владельцам, очень полезно иметь тупой тип указателя null-after-move, см. stackoverflow.com /a/22307926/981959 - person Jonathan Wakely   schedule 11.03.2014observer_ptr
было нулевым после перемещения, его можно использовать для реализации правила нуля для типов, у которых есть член-указатель. Это очень полезная функция. Любой тип, который имеет член-указатель и что-то делает с ним в деструкторе, если указатель не нулевой, может использоватьtidy_ptr
(например,unique_lock
, типы, подобные ScopeGuard, и т. д.) - person Jonathan Wakely   schedule 11.03.2014std::string
иstd::vector
. Нет гарантии, чтоstring
илиvector
пусты после хода. Они остаются в действительном, но неуказанном состоянии. Некоторые типы, такие какunique_ptr
,shared_ptr
,unique_lock
иfuture
, обеспечивают более надежную гарантию пребывания в известном состоянии после перемещения, контейнеры этого не гарантируют. - person Jonathan Wakely   schedule 11.03.2014void f(X*)
намеревается делать с указателем (получит ли он право собственности?) Это полезно. Я просто думаю, что было бы полезнее, если бы он также имел одно дополнительное свойство и был бы нулевым после перемещения, иначе мне нужен другой тупой интеллектуальный указатель, который точно такой же, за исключением того, что он является нулевым после перемещения. . - person Jonathan Wakely   schedule 11.03.2014tidy_ptr
. - person juanchopanza   schedule 11.03.2014