我不清楚它的好处是什么。
如果我有:
Foo* foo = nullptr;
std::unique_ptr<Foo> unique_foo(foo);
在那种情况下是否调用了nullptr_t构造函数?或者只有你这样做:
std::unique_ptr<Foo> unique_foo(nullptr);
谢谢!
有一些讨论here允许你传入nullptr_t,否则它不会编译,因为它不会转换为类型指针。所以我的问题可能是为什么它没有投射?
答案 0 :(得分:12)
可能的原因是unique_ptr
参数的unique_ptr::pointer
构造函数是explicit
。这意味着在没有unique_ptr(nullptr_t)
构造函数的情况下,以下代码将无法编译。
std::unique_ptr<int> intp = nullptr;
由于unique_ptr
旨在成为一个轻量级智能指针,它非常模仿原始指针语义,因此需要编译上述代码。
在第一个示例中,未调用nullptr_t
构造函数,因为参数的类型为Foo*
,即使其值为nullptr
。
答案 1 :(得分:2)
导致添加构造函数的原始提案是here,并解释了用例:它旨在使if (p == 0)
编译。这是有效的,因为在该比较中,==
的RHS可隐式转换为p
的类型,因为nullptr
构造函数。
在此更改之前,unique_ptr
具有bool-ish类型的隐式转换运算符,因此比较有效。仅将其更改为explicit operator bool()
会使比较失效。
答案 2 :(得分:1)
恰好有Foo*
值的0
不是nullptr_t
类型,而是类型Foo*
。因此,只传递nullptr
使用nullptr_t
构造函数。