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())之前运行,该命令仍然是未指定的。