Почему я не могу отличить nullptr до 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));

почему?

Ответ 1

Поскольку концепция weak_ptr может быть построена только из других weak_ptr или shared_ptr. Просто не имеет смысла строить из необработанного указателя, будь то nullptr или нет.

Вы можете использовать построенный по умолчанию 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>());

Ответ 2

Основной целью слабого указателя обычно является знать, существует ли еще объект, который может быть уничтожен другим кодом. Как мог слабый указатель, построенный из обычного указателя, знать, существует ли объект еще? Можете ли вы представить себе, как это может работать?