2012-04-23 50 views
19

C++ 11's std :: shared_ptr <>提供了一种布尔运算符。为什么std :: weak_ptr <>不提供布尔转换?

operator unspecified-bool-type() const; 

(这不是一个直线上升operator bool() const由于bool类型的dangers from implicit casting

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

if(!wp.expired()) 

,当我想要键入

if(wp) 

为什么没有布尔转换为weak_ptr的?

+1

因为功能默认没有实现? – 2012-04-23 15:02:15

+1

'operator bool'现在可以在C++ 11中直接安全地完成:http://stackoverflow.com/a/6242355/46642 – 2012-04-23 18:55:26

回答

28

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

如果要检查指针是否存在,请使用lock并检查获得的shared_ptr

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

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

+0

“*如果要检查指针是否处于活动状态,请使用锁定并检查获得的shared_ptr。*“危险,因为你可能会丢弃最后一个指向对象的强指针,所以你只能在调用对象的析构函数的安全上下文中执行此操作。 – 2016-04-09 23:11:08

+0

我会建议任何上下文都可以安全地调用任何对象的析构函数,因为析构函数应该以可以随时安全调用的方式编写(AIUI,这需要在异常处理的情况下才能在一般情况下工作因为堆栈展开可能会破坏任意的对象)。尽管如此,我会对反例感兴趣。 – Keiji 2016-05-31 16:03:46

相关问题