【发布时间】:2018-03-06 21:43:56
【问题描述】:
文档说 Deleter 应该是:
- nothrow 可构造
- nothrow 可调用(因为它是从
~unique_ptr() noexcept调用的 - nothrow 可破坏(出于上述原因)
我的问题是为什么 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;
};
};
【问题讨论】:
-
它到底在哪里说明了您在第一句话中所声称的内容?
-
什么文件说明了这一点?
-
如果它抛出,那么它是 UB。
noexcept不是函数签名的一部分,因此您无法检查删除器是否被标记。 -
啊,C++17。我忘了他们加了。他们可能会在未来的标准中更改
unique_ptr。虽然你不知道它是什么时候制作的。
标签: c++ unique-ptr noexcept exception-safety