我似乎记得在C ++ 11中,他们对排序行为进行了一些更改,现在i ++和++我有不同的排序要求。
f(++i, ++i)
仍然是未定义的行为吗? f(i++, i++)
和f(++i, ++i)
之间有什么区别?
答案 0 :(得分:7)
除非i
是类类型,否则它是未定义的行为。从C ++ 11 1.9 / 15:
除非另有说明,否则对单个操作符的操作数和单个表达式的子表达式的评估是不合理的。
后面有一条说明,澄清这确实适用于函数参数:
[注意:与不同参数表达式相关的值计算和副作用未被排序。 -end note ]
您的代码在没有排序的情况下两次修改同一个对象,因此使用相同的段落:
如果对标量对象的副作用相对于同一标量对象的另一个副作用或值计算未被排序 使用相同标量对象的值,行为未定义。
如果i
是类类型,则++
将调用函数,并且函数调用始终相对于彼此进行排序。因此,标量对象的任何修改都将被不确定地排序;没有未定义的行为,但结果未指定。
答案 1 :(得分:3)
它仍然是未定义的行为:
如果对标量对象的副作用相对于同一标量对象的另一个副作用或使用相同标量对象的值进行的值计算未被排序,则行为未定义。
§1.9[intro.execution]
并且功能参数的评估顺序相对于彼此是无序的。
答案 2 :(得分:1)
在C ++ 17中,它没有未定义。 http://en.cppreference.com/w/cpp/language/eval_order#Undefined_behavior
f(++ i,++ i); //在C ++ 17之前未定义的行为,在C ++ 17之后未指定
在函数调用中,每个参数初始化的值计算和副作用对于任何其他参数的值计算和副作用都是不确定的。