为什么std :: weak_ptr<>提供布尔转换?

时间:2012-04-23 14:59:45

标签: c++ c++11 shared-ptr weak-ptr

C ++ 11的std :: shared_ptr<>提供了一种bool算子。

operator unspecified-bool-type() const;

(由于operator bool() const类型为dangers from implicit casting,因此不是直接bool。)

为什么不std :: weak_ptr<>有一个类似的运营商?我发现自己经常打字

if( !wp.expired() )

当我想输入

if( wp )

为什么没有针对weak_ptr的bool转换?

1 个答案:

答案 0 :(得分:29)

if(!wp.expired())在多线程代码中几乎总是错误的检查,因为在if语句之后,指针可能会到期。因此,如果weak_ptrbool转换的语义完全相同,那么它永远不会被使用。

如果要检查指针是否处于活动状态,请使用lock并检查获得的shared_ptr

如果您想知道指针是否已死,请使用expired

如您所见,提供布尔转换没有意义。对于shared_ptr,它完全可以。顺便说一句,转换运算符在C ++ 11中是explicit operator bool() const noexcept;