Я подумал, что очень любопытно, когда я обнаружил, что стандарт определяет std::unique_ptr
и std::shared_ptr
двумя совершенно разными способами относительно Deleter, которыми может владеть указатель. Вот объявление из cppreference:: unique_ptr и cppreference:: shared_ptr:
template<
class T,
class Deleter = std::default_delete<T>
> class unique_ptr;
template< class T > class shared_ptr;
Как вы видите, unique_ptr "сохраняет" тип объекта Deleter в качестве аргумента шаблона. Это также можно увидеть в способе удаления Deleter из указателя позже:
// unique_ptr has a member function to retrieve the Deleter
template<
class T,
class Deleter = std::default_delete<T>
>
Deleter& unique_ptr<T, Deleter>::get_deleter();
// For shared_ptr this is not a member function
template<class Deleter, class T>
Deleter* get_deleter(const std::shared_ptr<T>& p);
Может кто-нибудь объяснить рациональность этой разницы? Я явно одобряю концепцию unique_ptr
, почему это не относится к shared_ptr
? Кроме того, почему get_deleter
была бы не-членной функцией в последнем случае?