为什么std :: unique_ptr没有明确要求noexcept Deleter?

时间:2018-03-06 21:43:56

标签: c++ unique-ptr noexcept exception-safety

文档说Deleter应该是:

  • nothrow constructible
  • nothrow callable(因为它是从~unique_ptr() noexcept
  • 调用的
  • nothrow destructible(由于上述原因)

我的问题是为什么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;
    };
};

Live Demo

1 个答案:

答案 0 :(得分:2)

标准仅根据uniqe_ptr的操作定义unique_ptr删除者的要求。虽然这些要求总是说像

  

〜的unique_ptr();
  要求:表达式get_deleter()(get())应该格式正确,应具有明确定义的行为,并且不应抛出异常。

标准从未明确指定删除者必须有noexcept operator()

我认为这个措辞被选择为与C ++ 14保持向后兼容。在该标准中,noexcept不是函数签名的一部分,并且在C ++ 17中添加该需求可能会破坏大量使用自定义删除的代码而不将其操作明确标记为{ {1}}。