Why doesn't std::weak_ptr<> provide a bool conversion?

c++, c++11, shared-ptr, weak-ptr

Solution

`if(!wp.expired())` is almost always a wrong check in multithreaded code, because directly after that `if` statement the pointer could expire. As such, if `weak_ptr` had exactly that as the semantics for the `bool` conversion, it would never be used anyways.

If you want to check if the pointer is alive, use `lock` and check the obtained `shared_ptr`.

If you want to know if the pointer is dead, use `expired`.

As you can see, it just doesn't make sense to provide a boolean conversion. For `shared_ptr`, it totally does. Btw, the conversion operator is `explicit operator bool() const noexcept;` in C++11.

Problem

C++11's std::shared_ptr<> provides a kind of bool operator. ``` operator unspecified-bool-type() const; ``` (It's not a straight-up `operator bool() const` due to the dangers from implicit casting of type `bool`.) Why doesn't std::weak_ptr<> have a similar operator? I find myself constantly typing ``` if( !wp.expired() ) ``` when I want to type ``` if( wp ) ``` Why no bool conversion for weak_ptr?

Original source

Related problems