为什么std :: weak_ptr <>不提供bool转换?

Old*_*ier 21 c++ shared-ptr weak-ptr c++11

C++ 11的std :: shared_ptr <>提供了一种bool运算符.

operator unspecified-bool-type() const;
Run Code Online (Sandbox Code Playgroud)

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

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

if( !wp.expired() )
Run Code Online (Sandbox Code Playgroud)

当我想打字的时候

if( wp )
Run Code Online (Sandbox Code Playgroud)

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

Xeo*_*Xeo 29

if(!wp.expired())在多线程代码中几乎总是错误的检查,因为在该if语句之后直接指针可能会到期.因此,如果weak_ptr将其作为bool转换的语义,那么它永远不会被使用.

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

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

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

  • 我建议任何上下文都可以安全地调用任何对象的析构函数,因为析构函数的编写方式应使其可以在任何时间安全地调用(AIUI,在一般情况下,异常处理必须如此) ,因为展开堆栈可能会破坏任意对象)。我会对反例感兴趣。 (4认同)
  • “*如果你想检查指针是否还活着,请使用锁并检查获得的shared_ptr。*”危险,因为你可能最终会丢弃指向该对象的最后一个强指针,因此你只能在它所在的上下文中执行此操作可以安全地调用对象的析构函数。 (2认同)
  • _提供布尔转换是没有意义的_:我不同意。如果我想检查“weak_ptr”是否为空,例如默认构造的,正确的语义是“operator bool”之一。使用“过期”在语义上意味着它曾经有效。 (2认同)