在 C++17 中,这段代码应该产生警告吗?

NoS*_*tAl 2 c++ sequence-points c++17

正如在这个godbolt链接上看到的

c++14 模式下的 clang(但不是 c++17)和 c++17 模式下的 GCC 会产生关于排序的警告。我假设在 C++17 中,= 的 rhs 上的所有内容都在 lhs 之前进行评估,所以我不确定 gcc 警告是否正确。

Code is:
static int index =0; 
void f(int* pindex){
        pindex[index] = 5;
        pindex[index] = index++;

}
int main(){

}
Run Code Online (Sandbox Code Playgroud)

gcc警告是:

:在函数“void f(int*)”中:
:4:30: 警告:对“索引”的操作可能未定义 [-Wsequence-point]
4 |         pindex[index] = index++;

  |                         ~~~~~^~
Run Code Online (Sandbox Code Playgroud) :4:30: 警告:对“索引”的操作可能未定义 [-Wsequence-point]

编译器返回:0

注意:我知道标准没有指定警告,指定问题wrt警告比谈论序列点/排序保证要容易得多。

cdh*_*wie 6

这段代码可能会在 C++17 之前产生警告,因为它是未定义的行为,但在 C++17 或更高版本中不应产生警告,因为行为已定义:

  1. 在每一个简单赋值表达式E1=E2和每一个复合赋值表达式中E1@=E2,每一个值计算和副作用都排E2在每一个值计算和副作用之前E1(C++17 起)

(来源)

GCC 的警告是一个错误。(希望这是唯一的错误,GCC 实际上并没有将这种情况视为 UB。)