Почему уникальный ptr имеет deleter в качестве параметра типа, а общий ptr-нет?


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

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

Почему же идея не была использована для std::unique_ptr?

2 57

2 ответа:

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

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

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

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

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