关于使用共享指针的评估顺序

Posted

技术标签:

【中文标题】关于使用共享指针的评估顺序【英文标题】:about order of evaluation using shared pointers 【发布时间】:2017-07-06 21:21:44 【问题描述】:

我对使用共享指针时 if 子句中的求值顺序有疑问。

假设我有以下内容

struct MyClass 
   bool canUse() return false;  // dummmy value


std::shared_ptr<MyClass> myclass_ptr_;

/// other code..

if(myclass_ptr_ && myclass_ptr_->canUse()) 
   // do something

你知道在这种情况下 C++ 是否总是保证 myclass_ptr_myclass_ptr_-&gt;canUse() 之前被评估?

如果情况并非总是如此,myclass_ptr_ 可能会因为某种原因出现并且它没有被初始化,那么我肯定会冒着使应用程序崩溃的风险。

当我运行这个应用程序时,它似乎运行良好,但我只是想与某人确认以避免在发布时出现令人讨厌的意外。

【问题讨论】:

&amp;&amp; 的左操作数总是首先计算。如果false,则不计算右操作数。除非您使用用户定义的重载 &amp;&amp; 【参考方案1】:

你知道在那种情况下 C++ 是否总是保证 myclass_ptr_ 是 在myclass_ptr_-&gt;canUse() 之前评估过?

是的。这种情况不属于order of evaluation,而是short circuiting&amp;&amp;的规则。

来自this page的脚注。

内置运算符 && 和 ||执行短路评估(做 如果结果已知,则不计算第二个操作数 评估第一个),但重载运算符的行为类似于常规 函数调用并始终计算两个操作数

另请阅读Why there is no circuiting when these operators are overloaded。

【讨论】:

@Jain:非常感谢。第二条评论可能澄清了我心中的另一个疑问。 如果有帮助我很高兴:)

以上是关于关于使用共享指针的评估顺序的主要内容,如果未能解决你的问题,请参考以下文章

栈和队列

排序点和评估顺序

0708关于理解mysql SQL执行顺序

栈练习之Example004-顺序栈 s0 和 s1 共享一个存储区 elem,设计共享栈关于入栈和出栈操作的算法

渴望评估/应用顺序和惰性评估/正常顺序

使用 std::cout 评估参数的顺序