C++ 为什么unique\u ptr有一个nullptr\t构造函数?

C++ 为什么unique\u ptr有一个nullptr\t构造函数?,c++,c++11,unique-ptr,C++,C++11,Unique Ptr,我不清楚有什么好处 如果我有: Foo* foo = nullptr; std::unique_ptr<Foo> unique_foo(foo); Foo*Foo=nullptr; std::unique_ptr unique_foo(foo); 在这种情况下是否调用了nullptr\t构造函数?或者只有在您这样做的情况下: std::unique_ptr<Foo> unique_foo(nullptr); std::unique_ptr unique_foo(nu

我不清楚有什么好处

如果我有:

Foo* foo = nullptr;
std::unique_ptr<Foo> unique_foo(foo);
Foo*Foo=nullptr;
std::unique_ptr unique_foo(foo);
在这种情况下是否调用了nullptr\t构造函数?或者只有在您这样做的情况下:

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


有一些讨论是为了允许您传入nullptr\t,否则它将无法编译,因为它不会强制转换为类型指针。所以我的问题可能是它为什么不强制转换?

A
Foo*
恰好值为
0
的不是type
nullptr\t
,而是type
Foo*
。因此,只有传递
nullptr
时才使用
nullptr\t
构造函数。

一个可能的原因是采用
unique\u ptr::pointer
参数的
unique\u ptr
构造函数是
显式的。这意味着在缺少
unique\u ptr(nullptr\u t)
构造函数的情况下,以下代码将无法编译

std::unique_ptr<int> intp = nullptr;
std::unique_ptr intp=nullptr;
由于
unique_ptr
旨在成为一个轻量级智能指针,它非常模仿原始指针语义,因此需要编译上述代码



在第一个示例中,未调用
nullptr\t
构造函数,因为参数的类型是
Foo*
,即使其值是
nullptr
,导致添加构造函数的原始建议是,并解释了用例:它旨在使
if(p==0)
编译。这是因为在该比较中,
==
的RHS由于
nullptr
构造函数而隐式转换为
p
的类型


在此更改之前,
unique\u ptr
有一个到bool-ish类型的隐式转换运算符,因此比较是有效的。仅将其更改为
显式运算符bool()
将使比较无效。

因此,一个相关的问题(在我的问题中添加了一个附录)是,为什么nullptr\u t不能强制转换为任何类型的0 t*?如果密切模仿原始指针语义非常重要,那么为什么显式构造函数?@Brian:为了避免隐式转换,比如在这种情况下,
T*p=newt();f(p)
其中
f
获取
std::unique_ptr
,这意味着它隐式地或无意地获取了资源的所有权。这是不好的,因为程序员可能并不打算这样做。因此,构造函数被声明为显式的,以迫使程序员编写
f(std::unique_ptr(p))如果他们想转让所有权。@Brian我同意Nawaz的观点。它可能会导致意外的所有权转移,但在
nullptr
案例中这不是一个问题。这就解释了为什么构造函数是显式的。让nullptr\u t“自动”可转换为Foo*?@Kyle它可自动转换为键入
Foo*
。但这需要显式地转换为
unique_ptr
,这对于
nullptr
常量来说是愚蠢的:不需要防止所有权转移。