函数调用中表达式的求值顺序

joh*_*ohn 5 c++ c++17

给定一个函数调用func(E1, E2, E3),其中 E1 等是任意表达式,每个表达式相对于每个其他表达式是不确定的,还是所有表达式都是未排序的(即评估可以重叠)?

我看过这个cppreference 页面,它在规则 15 中使用了这句话

在函数调用中,每个参数初始化的值计算和副作用相对于任何其他参数的值计算和副作用是不确定的。

我认为这与我要问的不太一样,因为参数的初始化只是参数表达式评估的最后一步。

但是讨论其他内容的规则 21 似乎暗示函数调用中的每个子表达式都是不确定的

括号中的初始值设定项中以逗号分隔的表达式列表中的每个表达式都像函数调用一样求值(不确定顺序)

所以我有点困惑,任何指导表示赞赏。

Ton*_*ous 5

C++17 状态在

8.2.2 函数调用【expr.call】

4 ... The initialization and destruction of each parameter occurs within the context of the calling function.


5 ... Note: All side effects of argument evaluations are sequenced before the function is entered


5 ... The initialization of a parameter, including every associated value computation and side effect, is indeterminately sequenced with respect to that of any other parameter.

I hope this (my bolding) is clear enough.

(ref: n4659, final C++17 draft)

  • @VioletGiraffe 谢谢你,我知道了。然而,有可能获得每个标准的免费的非常接近发布的草案版本,或者有些人可能实际上为该标准付费。无论如何,当前的工作草案(在撰写本文时)比 OP 询问的标准晚了大约三年,这很可能会在这些规则中产生差异。简而言之:引用 C++20 草案并不能证明 C++17 规则。 (2认同)