基于范围的 for 语句中的 GCC 错误

GCC bug in range-based for statement

本文关键字:for 语句 GCC 错误 于范围 范围      更新时间:2023-10-16

我似乎在GCC中遇到了一个奇怪的错误。考虑

for (int i = 5 : {1, 2, 3})
     std::cout << i << ", ";

虽然这个无意义的代码被 Clang 正确拒绝,但它在所有最近的 GCC 版本上都能很好地编译和执行。奇怪的是,根本没有产出,既不产生1, 2, 3,也不产生5, 5, 5

如果我们现在更进一步并考虑此代码

int arr[] {1, 2, 3};
for (int i = 5: arr)
    std::cout << i << ", ";

GCC 警告我们不使用数组,这意味着循环被忽略。

此代码是否调用未定义的行为?还是格式不正确,无需诊断?或者它只是一个奇怪的错误?
该标准在 [stmt.ranged]/1 中指定将声明替换为以下行:

范围声明= *__begin;

。这样的声明显然是格式错误的。

编辑:报告错误后,Paolo Carlini已将其修复为5.0版。

这两个示例都是无效的语法,需要进行诊断。

基于范围的 for 的语法在 6.5/1 中:

迭代语句

  • for ( for range
  • -声明 : for-range-initializer )语句

对于范围声明

  • attribute-specifier-seq opt decl-specifier-seq declarator

这不允许在冒号之前使用初始值设定项。