3

标准说:

D 应满足 DefaultConstructible 的要求(表 19),并且该构造不应抛出异常。

对于这两个构造函数:

constexpr unique_ptr() noexcept;
explicit unique_ptr(pointer p) noexcept;

然而 libc++ 和 libstdc++ 都只检查is_pointer<D>. 为什么?

4

2 回答 2

6

构造函数只需要检查类型是否为指针,因为函数指针是唯一可以初始化值并最终无效的有效删除器类型。

这些构造函数都尝试对删除器类型进行值初始化(libstdc++至少,但我猜libc++是相同的)。如果D是不满足的引用类型或函数对象类型,则不会编译DefaultConstructible。但是,如果它D是一个函数指针,它会编译,并且你最终会得到一个无效的函数指针作为删除器,因此指针检查是必要的。

如果他们明确检查是否键入 is ,则结果错误消息可能会更清晰DefaultConstructible,但这样做并不是绝对必要的。

于 2013-04-24T18:35:37.340 回答
0

该要求是对用户的约束,而不是对实现的约束。如果您尝试使用没有默认构造函数的删除器,则行为未定义。所以你可以通过实现来尝试弄清楚你的实现做了什么,或者你不能这样做。<g>.

于 2013-04-24T18:51:59.190 回答