C++ 在C++;17此代码是否应产生警告?
正如在这个锁销上看到的 c++14模式(但不是c++17)中的叮当声和c++17模式中的GCC会产生有关排序的警告。 我假设在C++17中,=的rhs上的所有内容都是在lhs之前计算的,所以我不确定gcc警告是否正确C++ 在C++;17此代码是否应产生警告?,c++,c++17,sequence-points,C++,C++17,Sequence Points,正如在这个锁销上看到的 c++14模式(但不是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警告是: :在
Code is:
static int index =0;
void f(int* pindex){
pindex[index] = 5;
pindex[index] = index++;
}
int main(){
}
gcc警告是:
:在函数“void f(int*)”中:
:4:30:警告:“索引”上的操作可能未定义
[-wsequencepoint]
4 | pindex[index] = index++;
| ~~~~~^~
:4:30:警告:“索引”上的操作可能未定义
[-wsequencepoint]
4 | pindex[index] = index++;
| ~~~~~^~
编译器返回:0
注意:我知道标准没有规定任何关于警告的内容,只不过指定问题wrt warnings要比谈论序列点/顺序保证容易得多。此代码在C++17之前可能会产生警告,其中它是未定义的行为,但在C++17或更高版本中,随着行为的定义,不应该产生警告:
E1=E2
和每个复合赋值表达式E1@=E2
中,E2
的每个值计算和副作用都在E1
的每个值计算和副作用之前排序(从C++17开始)GCC的警告是一个bug。(希望这是唯一的错误,GCC不会将此案例视为UB。)在c++17之前,这个确切的示例一直被列为未定义的行为。gcc的警告不正确,这似乎是对的。
pindex[index++]=index
产生相同的warningaccepted,但是cppreference链接对我来说是无用的,我就是不能解析所有的条件语言。。。我希望我可以选择语言版本,这样我就不必在试图学习时在头脑中解析ifs了。:)这就是我引用相关章节的原因。