文档说Deleter应该是:
~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;
};
};
答案 0 :(得分:2)
标准仅根据uniqe_ptr
的操作定义unique_ptr
删除者的要求。虽然这些要求总是说像
〜的unique_ptr();
要求:表达式get_deleter()(get())应该格式正确,应具有明确定义的行为,并且不应抛出异常。
标准从未明确指定删除者必须有noexcept
operator()
。
我认为这个措辞被选择为与C ++ 14保持向后兼容。在该标准中,noexcept
不是函数签名的一部分,并且在C ++ 17中添加该需求可能会破坏大量使用自定义删除的代码而不将其操作明确标记为{ {1}}。