pourquoi je ne peux pas lancer nullptr à faible ptr

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

je veux faire ceci:

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

ou la valeur par défaut de l'argument weak_ptr est nulle, comme:

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

mais, ce dont j'ai besoin est de le faire à la place:

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

pourquoi est-ce?

14
demandé sur uray 2012-07-01 16:22:42
la source

2 ответов

parce que a weak_ptr dans le concept ne peut être construit à partir d'un autre weak_ptr ou shared_ptr. Cela n'a tout simplement pas de sens de construire à partir d'un pointeur brut, que ce soit nullptr ou pas.

vous pouvez utiliser une construction par défautweak_ptr (std::weak_ptr<MyClass>()) où vous essayez d'utiliser nullptr:

auto newInstance = std::make_shared<MyClass>(std::weak_ptr<MyClass>());
void function(int arg,std::weak_ptr<MyClass> obj = std::weak_ptr<MyClass>());
25
répondu David 2012-07-01 16:36:54
la source

le but premier d'un pointeur faible est habituellement de savoir si un objet qui pourrait être détruit par un autre code existe toujours. Comment un pointeur faible construit à partir d'un pointeur ordinaire pourrait-il savoir si l'objet existe encore? Pouvez-vous imaginer un sens, cela pourrait fonctionner?

-1
répondu David Schwartz 2015-06-08 19:02:36
la source

Autres questions sur c++ null casting shared-ptr weak-ptr