C ++序列点和C ++ 17中评估顺序的更改

时间:2019-04-09 10:13:39

标签: c++ c++17 undefined-behavior sequence-points

我对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

2 个答案:

答案 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"));
}