我对changes对C ++ 17的影响方式感到困惑,即您不应在序列点之间两次修改一个变量。
例如,这是在C ++ 17中指定,未指定还是未定义的?
void func(int x, int y);
int x=47;
func(x++,x++);
我的猜测是UB。
编辑:额外的数据点:c ++ 2a模式下的clang HEAD给出
prog.cc:8:11: warning: multiple unsequenced modifications to 'x' [-Wunsequenced]
edit2:与C ++ 2a模式下的gcc HEAD相同
prog.cc:8:15:警告:“ x”上的操作可能未定义[-Wsequence-point]
edit3:使用预增量gcc和clang给出different results
答案 0 :(得分:1)
问题中的示例
int x = 0;
f(x++, x++);
现在是未指定的行为,而不是未定义的行为。这意味着它是有效的代码,但是实际发生的情况在编译器之间可能有所不同。
答案 1 :(得分:0)
未指定参数的评估顺序,这意味着编译器可以按任何顺序评估参数,但不应调用UB。这对于带有分配的参数是必要的,例如,分配本身具有副作用,但是对于程序的语义而言,分配的顺序无关紧要。
class person;
// consumes 2 persons, needs to delete them later
void use_persons(person* a, person* b);
int main() {
// Alice can be allocated before or after Bob
use_persons(new person("Alice"), new person("Bob"));
}