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

Col*_*mbo 23 c++ gcc for-loop g++ c++11

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

for (int i = 5 : {1, 2, 3})
     std::cout << i << ", ";
Run Code Online (Sandbox Code Playgroud)

虽然这个无意义的代码被Clang正确拒绝,但它在所有最近的GCC版本上编译并执行正常.但奇怪的是,没有输出,没有1, 2, 3也没有5, 5, 5,生产.

如果我们现在进一步考虑这个代码

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

GCC警告我们,该阵列没有使用,这意味着该循环被忽略.

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

对于范围声明 = *__begin;

......这样的声明显然是不正确的.

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

asc*_*ler 10

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

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

迭代声明:

  • ...
  • for ( for-range-declaration : for-range-initializer ) 语句

范围声明:

  • attribute-specifier-seq opt decl-specifier-seq 声明

在冒号之前不允许初始化程序.