Ответ 1
if(!wp.expired())
почти всегда является неправильной проверкой в многопоточном коде, потому что непосредственно после этого оператора if
указатель может истечь. Таким образом, если weak_ptr
имеет именно это как семантику преобразования bool
, он никогда не будет использоваться в любом случае.
Если вы хотите проверить, жив ли указатель, используйте lock
и проверьте полученный shared_ptr
.
Если вы хотите узнать, мертв ли указатель, используйте expired
.
Как вы можете видеть, просто не имеет смысла обеспечивать логическое преобразование. Для shared_ptr
это полностью выполняется. Btw, оператор преобразования explicit operator bool() const noexcept;
в С++ 11.