标准说:
D 应满足 DefaultConstructible 的要求(表 19),并且该构造不应抛出异常。
对于这两个构造函数:
constexpr unique_ptr() noexcept;
explicit unique_ptr(pointer p) noexcept;
然而 libc++ 和 libstdc++ 都只检查is_pointer<D>
. 为什么?
标准说:
D 应满足 DefaultConstructible 的要求(表 19),并且该构造不应抛出异常。
对于这两个构造函数:
constexpr unique_ptr() noexcept;
explicit unique_ptr(pointer p) noexcept;
然而 libc++ 和 libstdc++ 都只检查is_pointer<D>
. 为什么?
构造函数只需要检查类型是否为指针,因为函数指针是唯一可以初始化值并最终无效的有效删除器类型。
这些构造函数都尝试对删除器类型进行值初始化(libstdc++
至少,但我猜libc++
是相同的)。如果D
是不满足的引用类型或函数对象类型,则不会编译DefaultConstructible
。但是,如果它D
是一个函数指针,它会编译,并且你最终会得到一个无效的函数指针作为删除器,因此指针检查是必要的。
如果他们明确检查是否键入 is ,则结果错误消息可能会更清晰DefaultConstructible
,但这样做并不是绝对必要的。
该要求是对用户的约束,而不是对实现的约束。如果您尝试使用没有默认构造函数的删除器,则行为未定义。所以你可以通过实现来尝试弄清楚你的实现做了什么,或者你不能这样做。<g>
.