首页 > 解决方案 > 在 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(){

}

gcc 警告是:

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

  |                         ~~~~~^~
:4:30: 警告:对“索引”的操作可能未定义 [-Wsequence-point]

编译器返回:0

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

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

解决方案


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

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

来源

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


推荐阅读