为什么我不能将nullptr转换为weak_ptr <>

ura*_*ray 16 c++ null casting shared-ptr weak-ptr

class MyClass {
public:
     MyClass(std::weak_ptr<MyClass> parent){}
}
Run Code Online (Sandbox Code Playgroud)

我想做这个:

auto newInstance = std::make_shared<MyClass>(nullptr);
Run Code Online (Sandbox Code Playgroud)

或者weak_ptr参数的默认值为null,例如:

void function(int arg,std::weak_ptr<MyClass> obj = nullptr);
Run Code Online (Sandbox Code Playgroud)

但是,我需要的是这样做:

auto newInstance = std::make_shared<MyClass>(std::shared_ptr<MyClass>(nullptr));
Run Code Online (Sandbox Code Playgroud)

这是为什么?

Dav*_*vid 30

因为weak_ptr概念只能从另一个weak_ptr或另一个构造shared_ptr.从原始指针构造是否有意义,无论是否nullptr.

您可以使用默认的construct weak_ptr(std::weak_ptr<MyClass>())来尝试使用nullptr:

auto newInstance = std::make_shared<MyClass>(std::weak_ptr<MyClass>());
void function(int arg,std::weak_ptr<MyClass> obj = std::weak_ptr<MyClass>());
Run Code Online (Sandbox Code Playgroud)

  • `nullptr`有特殊类型`nullptr_t`,因此原始指针不能隐式转换为`nullptr_t`.因此我没有看到任何理由禁止`weak_ptr <T>(nullptr)`. (7认同)
  • `std::weak_ptr`中还有`.reset()`成员函数 (3认同)
  • @magras 我几年前写了这个答案,说实话我有点同意你的观点。从根本上讲,弱指针需要与shared_ptr 关联或不关联是有意义的。标准委员会显然认为 nullptr 不传达非关联以及默认构造。 (2认同)