Подтвердить что ты не робот

Почему unique_ptr имеет делетер в качестве параметра типа, а shared_ptr - нет?

Шаблон std::unique_ptr имеет два параметра: тип плацдарма и тип делетера. Этот второй параметр имеет значение по умолчанию, поэтому вы обычно просто пишете что-то вроде std::unique_ptr<int>.

Шаблон std::shared_ptr имеет только один параметр: тип получателя. Но вы также можете использовать пользовательский делетер с этим, даже если тип делетера не находится в шаблоне класса. Обычная реализация использует методы стирания типов для этого.

Есть ли причина, по которой одна и та же идея не использовалась для std::unique_ptr?

4b9b3361

Ответ 1

Отчасти причина в том, что shared_ptr нуждается в явном блоке управления в любом случае для подсчета количества ссылок и приклеивания делетера внутри, это не такая большая сделка сверху. unique_ptr однако не требует дополнительных накладных расходов, и добавление его будет непопулярным - оно должно быть классом с нулевой нагрузкой. unique_ptr предполагается статическим.

Вы всегда можете добавить свое собственное стирание типа сверху, если вы хотите этого поведения - например, вы можете иметь unique_ptr<T, std::function<void(T*)>>, то, что я делал в прошлом.

Ответ 2

Еще одна причина, в дополнение к той, которая указана DeadMG, заключалась бы в том, что можно написать

std::unique_ptr<int[]> a(new int[100]);

и ~unique_ptr вызывают правильную версию delete (через default_delete<_Tp[]>) благодаря специализации как для T, так и T[].