使用共享指针时,我对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_
可能由于某种原因而被追加并且未初始化,我冒着使应用程序崩溃的风险。
当我运行这个应用程序时似乎工作正常,但我只想与某人确认,以避免在发布中出现令人讨厌的意外。
答案 0 :(得分:3)
你知道在这种情况下C ++是否始终保证
myclass_ptr_
是 在myclass_ptr_->canUse()
之前评估?
是。此案例不属于&&
的{{3}}但order of evaluation规则。
从short circuiting的脚注开始。
内置运营商&amp;&amp;和||进行短路评估(做 如果结果在之后已知,则不评估第二个操作数 评估第一个),但重载的运算符表现得像常规 函数调用并始终评估两个操作数
另请阅读this page。