23

C++11 的 std::shared_ptr<> 提供了一种布尔运算符。

operator unspecified-bool-type() const;

operator bool() const(由于隐式转换类型的危险,这不是直接的bool。)

为什么 std::weak_ptr<> 没有类似的运算符?我发现自己不断打字

if( !wp.expired() )

当我想打字时

if( wp )

为什么weak_ptr 没有bool 转换?

4

1 回答 1

31

if(!wp.expired())在多线程代码中几乎总是错误检查,因为在该if语句之后指针可能会立即过期。因此,如果weak_ptr将其作为bool转换的语义,则无论如何都不会使用它。

如果要检查指针是否还活着,请使用lock并检查获得的shared_ptr.

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

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

于 2012-04-23T15:21:40.893 回答