在cppreference上,我看到以下文字:
在函数调用中,每个参数初始化的值计算和副作用对于任何其他参数的值计算和副作用都是不确定的。
Hovewer,我无法在C ++ 17标准中找到任何确认。
作为子表达式的函数参数应符合[intro.execution.17]:
除非另有说明,否则评估个体经营者的操作数和个体的子表达 表达式没有排序。 [注意:在执行期间多次计算的表达式中 一个程序,对其子表达式的无序和不确定顺序的评估不一定是 在不同的评估中表现一致。 - 结束注释]的操作数的值计算 在运算符的结果的值计算之前对运算符进行排序。如果对a有副作用 内存位置(4.4)相对于同一内存位置或a的另一个副作用是无序的 使用同一内存位置中任何对象的值进行值计算,并且它们不是潜在的 并发(4.7),行为未定义。 [注意:下一节强制类似,但更复杂 对潜在并发计算的限制。 - 结束说明]
这意味着,除非标准中的任何其他点禁止,否则应该对功能参数计算进行排序。我试图找到一个子串"不确定地"在标准文本中,10次出现看起来都与函数调用参数无关。
所以,问题是:在C ++ 17中,函数参数是否未经过排序或不确定排序?
答案 0 :(得分:2)
[expr.call]/5 postfix-expression 在表达式列表中的每个表达式和任何默认参数之前进行排序。参数的初始化(包括每个相关的值计算和副作用)相对于任何其他参数的不确定地排序。
强调我的。