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

时间:2012-07-01 12:22:43

标签: c++ casting null shared-ptr weak-ptr

class MyClass {
public:
     MyClass(std::weak_ptr<MyClass> parent){}
}

我想这样做:

auto newInstance = std::make_shared<MyClass>(nullptr);

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

void function(int arg,std::weak_ptr<MyClass> obj = nullptr);

但是,我需要做的是改为:

auto newInstance = std::make_shared<MyClass>(std::shared_ptr<MyClass>(nullptr));

为什么会这样?

2 个答案:

答案 0 :(得分:27)

因为概念中的weak_ptr只能由其他weak_ptrshared_ptr构建。从原始指针构造它是没有意义的,无论它是nullptr还是不是。

您可以使用默认构建的weak_ptrstd::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>());

答案 1 :(得分:-1)

弱指针的主要目的通常是知道可能被其他代码销毁的对象是否仍然存在。从普通指针构造的弱指针怎么可能知道对象是否仍然存在?你能想象出一种可行的方式吗?