Подтвердить что ты не робот

Почему std:: weak_ptr <> не обеспечивает преобразование bool?

С++ 11 std:: shared_ptr < > предоставляет своего рода оператор bool.

operator unspecified-bool-type() const;

(Это не прямая operator bool() const из-за опасностей от неявного литья типа bool.)

Почему у std:: weak_ptr < > нет аналогичного оператора? Я постоянно набираю

if( !wp.expired() )

когда я хочу напечатать

if( wp )

Почему нет bool-преобразования для weak_ptr?

4b9b3361

Ответ 1

if(!wp.expired()) почти всегда является неправильной проверкой в ​​многопоточном коде, потому что непосредственно после этого оператора if указатель может истечь. Таким образом, если weak_ptr имеет именно это как семантику преобразования bool, он никогда не будет использоваться в любом случае.

Если вы хотите проверить, жив ли указатель, используйте lock и проверьте полученный shared_ptr.

Если вы хотите узнать, мертв ли ​​указатель, используйте expired.

Как вы можете видеть, просто не имеет смысла обеспечивать логическое преобразование. Для shared_ptr это полностью выполняется. Btw, оператор преобразования explicit operator bool() const noexcept; в С++ 11.