关于使用共享指针的评估顺序
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_->canUse()
之前被评估?
如果情况并非总是如此,myclass_ptr_
可能会因为某种原因出现并且它没有被初始化,那么我肯定会冒着使应用程序崩溃的风险。
当我运行这个应用程序时,它似乎运行良好,但我只是想与某人确认以避免在发布时出现令人讨厌的意外。
【问题讨论】:
&&
的左操作数总是首先计算。如果false
,则不计算右操作数。除非您使用用户定义的重载 &&
【参考方案1】:
你知道在那种情况下 C++ 是否总是保证
myclass_ptr_
是 在myclass_ptr_->canUse()
之前评估过?
是的。这种情况不属于order of evaluation,而是short circuiting&&
的规则。
来自this page的脚注。
内置运算符 && 和 ||执行短路评估(做 如果结果已知,则不计算第二个操作数 评估第一个),但重载运算符的行为类似于常规 函数调用并始终计算两个操作数
另请阅读Why there is no circuiting when these operators are overloaded。
【讨论】:
@Jain:非常感谢。第二条评论可能澄清了我心中的另一个疑问。 如果有帮助我很高兴:)以上是关于关于使用共享指针的评估顺序的主要内容,如果未能解决你的问题,请参考以下文章