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