Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么libstdc和x2B+;和libc++;是否不检查默认唯一\u ptr构造函数的指针和引用类型D?_C++_Unique Ptr - Fatal编程技术网

C++ 为什么libstdc和x2B+;和libc++;是否不检查默认唯一\u ptr构造函数的指针和引用类型D?

C++ 为什么libstdc和x2B+;和libc++;是否不检查默认唯一\u ptr构造函数的指针和引用类型D?,c++,unique-ptr,C++,Unique Ptr,标准上说: D应满足可施工规范(表19)的要求,且 不应抛出异常 对于这两个构造函数: constexpr unique_ptr() noexcept; explicit unique_ptr(pointer p) noexcept; 然而,libc++和libstdc++都只检查是指针。为什么?构造函数只需检查类型是否为指针,因为函数指针是唯一可以值初始化并最终无效的有效删除器类型 这些构造函数都试图初始化deleter类型(至少在libstdc++中,但我猜libc++是相同的)。如果D是

标准上说:

D应满足可施工规范(表19)的要求,且 不应抛出异常

对于这两个构造函数:

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

然而,libc++和libstdc++都只检查
是指针。为什么?

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

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


在这种情况下,如果用户明确检查其类型是否为“DefaultConstructible”
,则生成的错误消息可能会更清晰,但这样做并非绝对必要。

该要求是对用户的约束,而不是对实现的约束。如果尝试使用没有默认构造函数的删除器,则行为未定义。因此,您可以仔细研究实现,试图找出您的实现做了什么,或者您不能这样做

我猜是因为构造函数试图默认构造对象,如果对象不是默认可构造的,则会产生编译器错误。@DavidBrown:
D
是删除器的类型here@DavidBrown这并不能解释为什么他们不遵循标准,也拒绝引用类型
D
@AndyProwl尽管如此,构造函数也将默认构造删除程序(查看libstdc++源代码,确实如此)。@rubenvb引用将被拒绝,因为尝试默认构造它将失败(这不是指针的情况,因此有必要进行指针检查)。+1。对我来说很有意义,因为某种原因,我在第一次查看时错过了元组的默认构造