Что такое `std :: reinterpret_pointer_cast` и когда его следует использовать? - PullRequest
1 голос
/ 11 марта 2020

Ссылка на ссылку: std::reinterpret_pointer_cast

Должно ли это использоваться, когда задействованы weak_ptr или shared_ptr (Почему? Всегда? Иногда?)

1 Ответ

6 голосов
/ 11 марта 2020

Как и все другие функции std::*_pointer_cast, это позволяет выполнять приведение между различными типами указателей, заключенными в std::shared_ptr, как если бы был приведен соответствующий необработанный указатель, но при сохранении общего владения.

Итак std::reinterpret_pointer_cast<T>(ptr) (в основном) такой же, как std::shared_ptr<T>(reinterpret_cast<T*>(ptr.get())), с тем важным отличием, что последний приведет к сохранению приведенного необработанного указателя в новом общем указателе, который не связан с исходным, так что управляемый объект будет дважды удален один раз исходным комплексным указателем и один раз новым (и последний потенциально может иметь неправильный тип).

Вместо std::reinterpret_pointer_cast<T>(ptr) (в основном) эквивалентно std::shared_ptr<T>(ptr, reinterpret_cast<T*>(ptr.get())), который использует так называемый конструктор псевдонимов из std::shared_ptr. Это позволяет получить std::shared_ptr ссылку на любой указатель (второй аргумент), при этом сохраняя право собственности, связанное с исходным shared_ptr (первый аргумент).

Так что вам следует использовать std::reinterpret_pointer_cast, если у вас есть a std::shared_ptr и вы бы использовали reinterpret_cast, если бы вместо этого был необработанный указатель.

Поскольку варианты использования для reinterpret_cast редки, у вас будет гораздо больше шансов использовать std::dynamic_pointer_cast или std::static_pointer_cast, которые полезны для приведения вниз и вниз в иерархиях классов.

...