Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

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?

like image 223
OldPeculier Avatar asked Apr 23 '12 14:04

OldPeculier


1 Answers

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.

like image 184
Xeo Avatar answered Oct 05 '22 09:10

Xeo