在 C++17 中,这段代码应该产生警告吗?
In C++17 should this code be producing warnings?
如上图所示 link
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: warning: operation on 'index' may be undefined
[-Wsequence-point]
4 | pindex[index] = index++;
| ~~~~~^~
:4:30: warning: operation on 'index' may be undefined
[-Wsequence-point]
Compiler returned: 0
注意:我知道标准没有指定任何关于警告的内容,只是在警告中指定问题比谈论序列 point/ordering 保证要容易得多。
此代码可能会在 C++17 之前产生警告,因为它是未定义的行为,但在 C++17 或更高版本中不应产生警告,因为行为已定义:
- In every simple assignment expression
E1=E2
and every compound assignment expression E1@=E2
, every value computation and side-effect of E2
is sequenced before every value computation and side effect of E1
(since C++17)
(Source)
GCC 的警告是一个错误。 (希望这是 唯一 错误,GCC 实际上不会将这种情况视为 UB。)
如上图所示 link
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: warning: operation on 'index' may be undefined [-Wsequence-point]:4:30: warning: operation on 'index' may be undefined [-Wsequence-point]4 | pindex[index] = index++; | ~~~~~^~
Compiler returned: 0
注意:我知道标准没有指定任何关于警告的内容,只是在警告中指定问题比谈论序列 point/ordering 保证要容易得多。
此代码可能会在 C++17 之前产生警告,因为它是未定义的行为,但在 C++17 或更高版本中不应产生警告,因为行为已定义:
- In every simple assignment expression
E1=E2
and every compound assignment expressionE1@=E2
, every value computation and side-effect ofE2
is sequenced before every value computation and side effect ofE1
(since C++17)
(Source)
GCC 的警告是一个错误。 (希望这是 唯一 错误,GCC 实际上不会将这种情况视为 UB。)