В документации сказано, что Deleter должен быть:
- не строить
- nothrow callable (потому что он вызывается из
~unique_ptr() noexcept
- неразрушаемый (по указанной выше причине)
Мой вопрос в том, почему uniqut_ptr
определено, чтобы разрешить Deleter
, который может бросить. Например. следующие Deleter
разрешены всеми конструкторами unique_ptr
:
struct BadDeleter
{
BadDeleter() noexcept(false) {}
~BadDeleter() noexcept(false) {}
BadDeleter(const BadDeleter&) noexcept(false) {}
BadDeleter(BadDeleter&) noexcept(false) {}
BadDeleter(BadDeleter&&) noexcept(false) {}
void operator()(char* p) const noexcept(false) {
delete p;
};
};
noexcept(false)
. Я не понимаю, как под этими определениями может кидать Deleter. - person Kentzo   schedule 07.03.2018noexcept
не является частью сигнатуры функции, поэтому вы не можете проверить, помечен ли удаляющий объект или нет. - person NathanOliver   schedule 07.03.2018unique_ptr
в будущем стандарте. Когда это было впервые сделано, хотя вы не могли бы сказать. - person NathanOliver   schedule 07.03.2018