f(++i, ++i) 是否未定义?

Is f(++i, ++i) undefined?

我好像记得在 C++11 中,他们对排序行为做了一些更改,现在 i++ 和 ++i 有不同的排序要求。

f(++i, ++i) 仍然是未定义的行为吗? f(i++, i++)f(++i, ++i) 有什么区别?

它仍然是未定义的行为:

If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined.

§1.9 [intro.execution]

并且函数参数的求值顺序相互之间是无序的。

这是未定义的行为,除非 i 是 class 类型。来自 C++11 1.9/15:

Except where noted, evaluations of operands of individual operators and of subexpressions of individual expressions are unsequenced.

后跟注释以阐明这确实适用于函数参数:

[ Note: Value computations and side effects associated with different argument expressions are unsequenced. —end note ]

你的代码修改同一个对象两次,没有顺序,所以在同一个段落:

If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined.

如果 i 是 class 类型,那么 ++ 将调用一个函数,并且函数调用总是相对于彼此排序的。因此,对标量对象的任何修改都将不确定地排序;没有未定义的行为,但结果未指定。

在 C++17 中,它不是未定义的。 http://en.cppreference.com/w/cpp/language/eval_order#Undefined_behavior

f(++i, ++i); // undefined behavior until C++17, unspecified after C++17

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