c++ - 在 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:30: 警告:对“索引”的操作可能未定义 [-Wsequence-point]4 | pindex[index] = index++; | ~~~~~^~
编译器返回:0
注意:我知道标准没有指定任何关于警告的内容,只是指定问题 wrt 警告比谈论序列点/排序保证要容易得多。
解决方案
此代码可能会在 C++17 之前产生未定义行为的警告,但不应在 C++17 或更高版本中产生警告,因为行为已被定义:
- 在每个简单赋值表达式
E1=E2
和每个复合赋值表达式E1@=E2
中,每个值计算和副作用E2
都排在每个值计算和副作用之前E1
(C++17 起)
(来源)
GCC 的警告是一个错误。(希望这是唯一的错误,并且 GCC 实际上并没有将这种情况视为 UB。)
推荐阅读
- excel - 有选择地将行从一个工作表复制到新工作表上的新表
- dataframe - 在具有相同标题名称的单个数据框中按行连接多个文件
- ruby-on-rails - 在 Rails 中实现 Bootstrap 主题
- github - 在 GitHub 上更改或删除提交消息?
- jquery - 如何在除一个 div 之外的所有 div 中选择所有 div 类
- mysql - SQL 来自同一列的多个值与内部连接
- javascript - 忽略单词并删除区分大小写和空格以匹配
- python - 如何在 lambda 函数中使用时间序列索引
- function - 我无法让 CSS 应用于打印表
- php - 在 PHP 中匹配日期时间