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

C++ sequence points and changes to evaluation order in C++17

本文关键字:评估 顺序 C++17 C++      更新时间:2023-10-16

我对 C++17 的更改如何影响不应在序列点之间修改一个变量 2 次的规则的方式有点困惑。

例如,在 C++17 中是否指定、未指定或未定义?

void func(int x, int y);
int x=47;
func(x++,x++);

我的猜测是UB。

编辑:额外的数据点:C ++ 2a模式下的clang HEAD给出

prog.cc:8:11: 警告: 对"x"的多次未排序修改 [-Wunsequenced]

编辑2:与C++2a模式下的GCC头相同

prog.cc:8:15:警告:"x"上的操作可能未定义 [-Wsequence-point]

编辑3:使用预递增GCC和Clang给出不同的结果

您问题中的示例

int x = 0;
f(x++, x++);

现在是未指定的行为,而不是未定义的行为。这意味着它是有效的代码,但实际发生的情况可能因编译器而异。

参数的计算顺序未指定,这意味着编译器可以按任何顺序计算参数,但不应调用 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"));
}