为什么 std::unique_ptr 没有明确要求 noexcept 删除器?

Why std::unique_ptr does not explicitly require a noexcept Deleter?

文档说 Deleter 应该是:

我的问题是为什么 uniqut_ptr 被定义为允许可能抛出的 Deleter。例如。所有 unique_ptr 构造函数都允许以下 Deleter

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

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

~unique_ptr();
Requires: The expression get_deleter()(get()) shall be well formed, shall have well-defined behavior, and shall not throw exceptions.

标准从未明确规定删除器必须具有 noexcept operator().

我认为选择此措辞是为了在 C++14 中保留 backwards-compatible。在该标准中,noexcept 不是函数签名的一部分,在 C++17 中添加该要求可能会破坏大量使用自定义删除器但未将其操作显式标记为 noexcept 的代码.