不,没有这样的保证。根据C++标准,它是未指定的。
BjarneStroustrup在“C++编程语言”第三版第6.2.2节中也明确指出了这一点,并给出了一些推理:
在没有对表达式求值顺序的限制的情况下,可以生成更好的代码
虽然从技术上讲,这指的是同一节的前一部分,表示表达式各部分求值的顺序也未指定,即。
int x = f(2) + g(3); // unspecified whether f() or g() is called first
从[5.2.2]函数调用,
参数的求值顺序未指定。参数表达式求值的所有副作用在输入函数之前生效。
因此,不能保证bar()
会在baz()
之前运行,只能保证bar()
和baz()
会在foo
之前调用。
还从[5]表达式中注意到:
除非有说明[例如&
和的特殊规则],个别运算符的操作数和个别表达式的子表达式的求值顺序,以及副作用发生的顺序均未指定。
因此,即使您询问bar()
是否将在foo(bar()+baz())
中的bar()
之前运行,仍未指定顺序。
bar()和baz()没有指定的顺序--标准唯一规定的是,在调用foo()之前,它们都将被计算。摘自C++标准第5.2.2/8节:
参数的求值顺序未指定。