为什么 std::unique_ptr 没有明确要求 noexcept 删除器?
Why std::unique_ptr does not explicitly require a noexcept Deleter?
文档说 Deleter 应该是:
- 不可构造
- nothrow callable(因为它是从
~unique_ptr() noexcept
调用的
- 不可破坏(出于上述原因)
我的问题是为什么 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;
};
};
标准仅根据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
的代码.
文档说 Deleter 应该是:
- 不可构造
- nothrow callable(因为它是从
~unique_ptr() noexcept
调用的
- 不可破坏(出于上述原因)
我的问题是为什么 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;
};
};
标准仅根据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
的代码.