【问题标题】:Why doesn't std::weak_ptr<> provide a bool conversion?为什么 std::weak_ptr<> 不提供布尔转换?
【发布时间】:2012-05-04 05:02:24
【问题描述】:

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

operator unspecified-bool-type() const;

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

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

if( !wp.expired() )

当我想输入时

if( wp )

为什么weak_ptr没有bool转换?

【问题讨论】:

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


【解决方案1】:

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

如果要检查指针是否存活,请使用lock,并检查获取到的shared_ptr

如果你想知道指针是否失效,请使用expired

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

【讨论】:

  • "如果要检查指针是否处于活动状态,请使用 lock 并检查获得的 shared_ptr。" 很危险,因为您可能最终会丢弃指向该对象的最后一个强指针, 所以你只能在可以安全调用对象的析构函数的上下文中执行此操作。
  • 我建议任何上下文都可以安全地调用任何对象的析构函数,因为析构函数应该以可以随时安全调用的方式编写(AIUI,这需要用于异常处理在一般情况下工作,因为堆栈展开可能会破坏任何任意对象)。不过,我会对一个反例感兴趣。
  • 嗯,有些对象的析构函数可能会抛出或导致不必要的副作用。但这些对象一开始就不应该被包裹在 shared_ptr 中。
  • 提供布尔转换是没有意义的:我不同意。如果我想检查 weak_ptr 是否为空,例如默认构造,正确的语义是operator bool 之一。使用 expired 在语义上意味着它曾经是有效的。
猜你喜欢
  • 1970-01-01
  • 2010-10-04
  • 2017-07-05
  • 2012-07-02
  • 2015-03-14
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
相关资源
最近更新 更多