C++ f(+;+;i,+;+;i)是否未定义?
我似乎记得在C++11中,他们对排序行为做了一些更改,现在I++和+++I有不同的排序要求C++ f(+;+;i,+;+;i)是否未定义?,c++,language-lawyer,C++,Language Lawyer,我似乎记得在C++11中,他们对排序行为做了一些更改,现在I++和+++I有不同的排序要求 f(++i,+++i)仍然是未定义的行为吗?f(i++,i++)和f(++i,+++i)之间有什么区别?它仍然是未定义的行为: 如果标量对象上的副作用相对于同一标量对象上的另一副作用或使用同一标量对象的值进行的值计算未排序,则该行为未定义 §1.9[执行简介] 函数参数的求值顺序是相互不顺序的 它是未定义的行为,除非i是类类型。从C++11 1.9/15开始: 除非另有说明,否则对单个运算符的操作数和单个
f(++i,+++i)
仍然是未定义的行为吗?f(i++,i++)
和f(++i,+++i)
之间有什么区别?它仍然是未定义的行为:
如果标量对象上的副作用相对于同一标量对象上的另一副作用或使用同一标量对象的值进行的值计算未排序,则该行为未定义
§1.9[执行简介]
函数参数的求值顺序是相互不顺序的 它是未定义的行为,除非
i
是类类型。从C++11 1.9/15开始:
除非另有说明,否则对单个运算符的操作数和单个表达式的子表达式的求值是不排序的
然后是一个注释,说明这确实适用于函数参数:
[注:与不同参数表达式相关的值计算和副作用是不连续的。-结束注]
您的代码两次修改同一对象而不按顺序排列,因此按相同的段落:
如果标量对象上的一个副作用相对于同一标量对象上的另一个副作用或值计算未排序
使用相同标量对象的值,行为未定义
如果
i
是一个类类型,那么++
将调用一个函数,并且函数调用总是按顺序进行。因此,对标量对象的任何修改都将被不确定地排序;没有未定义的行为,但结果未指定。在C++17中,它不是未定义的。
f(++i,+++i);//C++17之前未定义的行为,C++17之后未指定
在函数调用中,每个参数初始化的值计算和副作用相对于任何其他参数的值计算和副作用是不确定的顺序。谁在乎?这是愚蠢的行为。我想在这里是合适的。哦,天哪。。。。这实际上是一个标记:|因为[intro.execution]/15中的示例显式调用了
f(i=-1,i=-1)
作为UB,问题的答案(对于标量i
s)应该是显而易见的。这个问题在这里会被问多少次???添加到这个答案中:codeint i=0;f(++i,+++i)
将导致调用i==2
和f
的参数组合如下:(1,1)、(1,2)、(2,1)、(2,2),我认为只有调用f(1,2)
和f(2,1)
才符合C++17标准,由于两个参数的值计算和初始化的副作用不应重叠。