C ++函数参数的评估顺序
如果我们有三个function(foo,bar和baz),就像…
foo(bar(), baz())
baz之前有没有用C ++标准来保证吧?
不,没有这样的保证。 它根据C ++标准是未定义的。
Bjarne Stroustrup也在“C ++编程语言”第3版第6.2.2节中明确地说明了一些原因:
在expression式评估顺序不受限制的情况下,可以生成更好的代码
尽pipe在技术上这是指同一部分的较早部分,该部分表示对expression的部分的评估顺序也是未定义的,即
int x = f(2) + g(3); // udefined whether f() or g() is called first
bar()和baz()没有指定的顺序 – 这个标准说的唯一的事情就是它们都会在foo()被调用之前被评估。 从C ++标准第5.2.2 / 8节:
参数的评估顺序是未指定的。
从[5.2.2]函数调用中,
参数的评估顺序是未指定的。 参数expression式评估的所有副作用在input函数之前生效。
因此,不能保证bar()
会在baz()
之前运行,只有bar()
和baz()
会在foo
之前被调用。
另请注意[5]expression式:
除非特别注明[例如
&&
和||
特殊规则 ],个别操作符的操作数和个别expression式的次expression式的评价顺序以及副作用的发生顺序没有特别说明。
所以即使你询问bar()
是否会在foo(bar() + baz())
之前运行,该命令仍然是未指定的。