Как и все другие функции 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
, которые полезны для приведения вниз и вниз в иерархиях классов.