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

Почему у unique_ptr:: reset нет перегрузок, которые принимают дебетер?

Есть ли причина, по которой unique_ptr::reset не имеет перегрузок, которые принимают const deleter& и deleter&& для соответствия его конструкторам, которые принимают их как второй аргумент?

Сохраненный дебетер в unique_ptr был бы скопирован или перенесен с аргументом из reset. Если делектор является не подлежащим копированию или невозмутимым, вызов соответствующей перегрузки reset не будет компилироваться. Похоже, что это будет согласованное поведение с конструкторами.

4b9b3361

Ответ 1

Я подумал о том, чтобы добавить это, но вы можете получить эквивалентную функциональность с оператором присваивания перемещения:

ptr = unique_ptr<T, D>(new T(another_value), D(another_state));

Итак, я решил не говорить то же самое с reset в интересах поддержания API достаточно малым.

Обновление

И я живу и узнаю...

Синтаксис может быть намного проще, чем показано выше:

ptr = {new T(another_value), D(another_state)};

Ответ 2

Потому что депилятор хранится в объекте при строительстве. Поскольку тип deleter является аргументом шаблона, после построения нет способа "преобразовать" класс для использования другого.