【发布时间】:2020-08-19 12:46:17
【问题描述】:
unique_ptr (constructor) @ cppreference
unique_ptr( pointer p, /* see below */ d1 ) noexcept;
(3)
unique_ptr( pointer p, /* see below */ d2 ) noexcept;
(4)
这里有2个构造函数,对Deleter case的描述是非引用的
a) If D is non-reference type A, then the signatures are:
unique_ptr(pointer p, const A& d) noexcept;
(1) (requires that Deleter is nothrow-CopyConstructible)
unique_ptr(pointer p, A&& d) noexcept;
(2) (requires that Deleter is nothrow-MoveConstructible)
我检查了 gcc 和 llvm 代码,但我没有看到 nothrow 要求被强制执行。构造函数 3-4 标记为 noexcept,因此在调用其构造函数时不应抛出 Deleter 是有道理的。但我不确定为什么在示例中他们提供的构造函数没有标记为noexcept。
struct D { // deleter
D() {};
D(const D&) { std::cout << "D copy ctor\n"; }
D(D&) { std::cout << "D non-const copy ctor\n";}
D(D&&) { std::cout << "D move ctor \n"; }
void operator()(Foo* p) const {
std::cout << "D is deleting a Foo\n";
delete p;
};
};
【问题讨论】:
标签: c++ c++17 language-lawyer noexcept