Pourquoi std:: faible ptr ne fournit-il pas une conversion bool?

C++11 est std::shared_ptr<> fournit une sorte de bool operator.

operator unspecified-bool-type() const;

(Ce n'est pas un straight-up operator bool() const en raison de la dangers de la fonte implicite de type bool.)

Pourquoi ne pas std::weak<> avoir une même opérateur? Je me retrouve constamment en tapant

if( !wp.expired() )

quand je veux taper

if( wp )

pourquoi pas de conversion bool pour weak_ptr?

20
demandé sur ildjarn 2012-04-23 18:59:44
la source

1 ответов

if(!wp.expired()) est presque toujours un contrôle erroné dans le code multithread, parce que directement après cela if déclaration le pointeur pourrait expirer. En tant que tel, si weak_ptr avait exactement comme la sémantique pour l' bool conversion, il ne serait jamais utilisé de toute façon.

Si vous voulez vérifier si le pointeur est vivant, utilisez lock et vérifiez les résultats obtenus shared_ptr.

Si vous voulez savoir si le pointeur est morte, utilisez expired.

comme vous pouvez le voir, ce n'est tout simplement pas logique de fournir une conversion booléenne. shared_ptr, c'est complètement n'. Btw, l'opérateur de conversion est explicit operator bool() const noexcept; en C++11.

29
répondu Xeo 2012-04-23 19:21:40
la source

Autres questions sur c++ c++11 shared-ptr weak-ptr