[英]In C++17 should this code be producing warnings?
正如在这个godbolt链接上看到的
clang 在 c++14 模式(但不是在 c++17 中)和 GCC 在 ZF4A2D1DA1DA520DF2ZA 模式下产生警告约 7 个 E 排序。 我假设在 C++17 中,= 的 rhs 上的所有东西都在 lhs 之前评估,所以我不确定 gcc 警告是否正确。
Code is:
static int index =0;
void f(int* pindex){
pindex[index] = 5;
pindex[index] = index++;
}
int main(){
}
gcc 警告是:
:在 function 'void f(int*)' 中::4:30: 警告:对“索引”的操作可能未定义 [-Wsequence-point]:4:30: 警告:对“索引”的操作可能未定义 [-Wsequence-point]4 | pindex[index] = index++; | ~~~~~^~
编译器返回:0
注意:我知道标准没有指定任何关于警告的内容,只是指定问题 wrt 警告比谈论序列点/排序保证要容易得多。
此代码可能会在 C++17 之前产生警告,它是未定义的行为,但不应该与 C++17 或更高版本的行为定义:
- 在每个简单赋值表达式
E1=E2
和每个复合赋值表达式E1@=E2
E2
,E2 的每个值计算和副作用都排在E1
的每个值计算和副作用之前(C++17 起)
(来源)
GCC 的警告是一个错误。 (希望这是唯一的错误,GCC 实际上并没有将这种情况视为 UB。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.