Почему у unique_ptr:: reset нет перегрузок, которые принимают дебетер?
Есть ли причина, по которой unique_ptr::reset
не имеет перегрузок, которые принимают const deleter&
и deleter&&
для соответствия его конструкторам, которые принимают их как второй аргумент?
Сохраненный дебетер в unique_ptr
был бы скопирован или перенесен с аргументом из reset
. Если делектор является не подлежащим копированию или невозмутимым, вызов соответствующей перегрузки reset
не будет компилироваться. Похоже, что это будет согласованное поведение с конструкторами.
Ответы
Ответ 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 является аргументом шаблона, после построения нет способа "преобразовать" класс для использования другого.