如果我们有这样的三个函数(foo,bar和baz)......
foo(bar(), baz())
C++标准是否保证在baz之前评估条形码?
Eli*_*sky 92
不,没有这样的保证.根据C++标准,它是未定义的.
Bjarne Stroustrup在"C++编程语言"第3版第6.2.2节中也明确地说过,有一些推理:
在没有对表达式评估顺序的限制的情况下,可以生成更好的代码
虽然从技术上讲这是指同一部分的早期部分,它表示表达式部分的评估顺序也是未定义的,即
int x = f(2) + g(3);   // unspecified whether f() or g() is called first
小智 20
bar()和baz()没有指定的顺序 - 标准说的唯一的事情就是在调用foo()之前它们都将被评估.从C++标准,第5.2.2/8节:
参数的评估顺序未指定.
Dan*_*ien 17
从[5.2.2]函数调用,
参数的评估顺序未指定.参数表达式求值的所有副作用在输入函数之前生效.
因此,不能保证bar()将之前运行baz(),只bar()和baz()会之前被调用foo.
另请注意[5]表达式:
除非另有说明[例如,特殊规则
&&和||],各个操作员的操作数的评估顺序和个别表达式的子表达式以及副作用的发生顺序是未指定的.
所以即使你在问是否bar()将之前运行baz()的foo(bar() + baz()),订单仍然是不确定的.
S.M*_*.M. 10
C++ 17规定了在C++ 17之前未指定的运算符的求值顺序.请参阅问题C++ 17引入的评估顺序保证是什么?但请注意你的表达
foo(bar(), baz())
仍未指定评估顺序.