Почему unique_ptr :: reset не имеет перегрузок, которые занимают удалитель? - PullRequest
16 голосов
/ 07 февраля 2012

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

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

Ответы [ 2 ]

26 голосов
/ 07 февраля 2012

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

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

Поэтому я решил не говорить то же самое с reset в интересах сохранения APIдостаточно мал.

Обновление

И я живу и учусь ...

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

ptr = {new T(another_value), D(another_state)};
3 голосов
/ 07 февраля 2012

Поскольку средство удаления сохраняется в объекте при создании. Поскольку тип удалителя является аргументом шаблона, после конструирования невозможно «преобразовать» класс в другой.

...