C++ 为什么';t标准:弱ptr<&燃气轮机;提供布尔转换?

C++ 为什么';t标准:弱ptr<&燃气轮机;提供布尔转换?,c++,c++11,shared-ptr,weak-ptr,C++,C++11,Shared Ptr,Weak Ptr,C++11的std::shared_ptr提供了一种bool操作符 operator unspecified-bool-type() const; (由于类型为bool,它不是一个直接向上的运算符bool()常量) 为什么std::weak_ptr没有类似的运算符?我发现自己经常打字 if( !wp.expired() ) 当我想打字的时候 if( wp ) 为什么没有弱ptr的bool转换?如果(!wp.expired())在多线程代码中几乎总是一个错误的检查,因为在该if语句之后指针可

C++11的std::shared_ptr提供了一种bool操作符

operator unspecified-bool-type() const;
(由于类型为
bool
,它不是一个直接向上的
运算符bool()常量

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

if( !wp.expired() )
当我想打字的时候

if( wp )
为什么没有弱ptr的bool转换?

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

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

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


正如您所看到的,提供布尔转换是没有意义的。对于
shared\u ptr
,它完全可以。顺便说一句,转换运算符是显式运算符bool()const noexcept在C++11中。

因为默认情况下没有实现功能?
操作符bool
现在可以在C++11中安全地直接执行:“如果要检查指针是否处于活动状态,请使用lock并检查获得的共享\u ptr。”这很危险,因为您可能会放弃指向对象的最后一个强指针,因此,您只能在安全地调用对象的析构函数的上下文中执行此操作。我建议,任何上下文都可以安全地调用任何对象的析构函数,因为析构函数的编写方式应确保可以随时安全地调用(AIUI,这需要在一般情况下进行异常处理,因为堆栈展开可能破坏任何任意对象)。不过,我对一个反例很感兴趣。嗯,有些对象的析构函数可能会抛出或导致不必要的副作用。但这些对象首先不应该包装在
共享的\u ptr
中。提供布尔转换是没有意义的:我不同意。如果我想检查
弱的\u ptr
是否正确空,例如默认构造,正确的语义是
运算符bool
中的一个。使用
expired
语义意味着它曾经有效。