为什么unique_ptr有一个nullptr_t构造函数?

时间:2014-08-26 04:51:38

标签: c++ c++11 unique-ptr

我不清楚它的好处是什么。

如果我有:

Foo* foo = nullptr;
std::unique_ptr<Foo> unique_foo(foo);

在那种情况下是否调用了nullptr_t构造函数?或者只有你这样做:

std::unique_ptr<Foo> unique_foo(nullptr);

谢谢!

有一些讨论here允许你传入nullptr_t,否则它不会编译,因为它不会转换为类型指针。所以我的问题可能是为什么它没有投射?

3 个答案:

答案 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构造函数。