Ответ 1
Если вы предоставляете deleter в качестве аргумента шаблона (как в unique_ptr
), он является частью типа, и вам не нужно хранить что-либо дополнительно в объектах этого типа.
Если deleter передается как аргумент конструктора (как в shared_ptr
), вам нужно сохранить его в объекте. Это является дополнительной гибкостью, поскольку вы можете использовать разные удалители для объектов того же типа.
Я предполагаю, что это причина: unique_ptr
должен быть очень легким объектом с нулевыми служебными данными. Сохранение дескрипторов с каждым unique_ptr
может удвоить их размер. Из-за этого люди вместо этого использовали бы добрые старые исходные указатели, что было бы неправильно.
С другой стороны, shared_ptr
не является таким легким, так как ему нужно хранить подсчет ссылок, поэтому хранение пользовательского делетера также выглядит как хороший компромисс.