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

Kyl*_*yle 7 c++ unique-ptr c++11

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

如果我有:

Foo* foo = nullptr;
std::unique_ptr<Foo> unique_foo(foo);
Run Code Online (Sandbox Code Playgroud)

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

std::unique_ptr<Foo> unique_foo(nullptr);
Run Code Online (Sandbox Code Playgroud)

谢谢!

有一些讨论,这里是让你来传递nullptr_t,否则将无法编译,因为它不会转换为指针类型.所以我的问题可能是为什么它不投?

Pra*_*ian 13

一个可能的原因是unique_ptr接受unique_ptr::pointer参数的构造函数是explicit.这意味着在没有unique_ptr(nullptr_t)构造函数的情况下,以下代码将无法编译.

std::unique_ptr<int> intp = nullptr;
Run Code Online (Sandbox Code Playgroud)

由于a unique_ptr旨在成为一种轻量级智能指针,它非常模仿原始指针语义,因此需要编译上述代码.


在第一个示例中,nullptr_t未调用构造函数,因为参数的类型是Foo*,即使其值为nullptr.

  • @Brian:为了避免隐式转换,例如在这种情况下,`T*p = new T(); f(p);`其中`f`采用`std :: unique_ptr`,这反过来意味着它隐含地取得了资源的所有权**或者意外地**.这很糟糕,因为程序员可能并不打算这样做.所以构造函数被声明为`explicit`,以便强制程序员编写`f(std :: unique_ptr <T>(p));`如果他们想要转移所有权. (8认同)
  • @Kyle它可以自动转换为类型`Foo*`.但那需要显式转换为`unique_ptr`,这对于`nullptr`常量来说是愚蠢的:没有所有权转移来防范. (2认同)