Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;17此代码是否应产生警告?_C++_C++17_Sequence Points - Fatal编程技术网

C++ 在C++;17此代码是否应产生警告?

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警告是: :在

正如在这个锁销上看到的

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警告是:

:在函数“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了。:)这就是我引用相关章节的原因。