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

时间:2014-11-19 23:20:59

标签: c++ c++11 gcc for-loop g++

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

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

虽然这个荒谬的代码是correctly rejected by Clangit compiles and executes fine on all recent GCC versions。奇怪的是,根本没有产生1, 2, 35, 5, 5的输出。

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

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

GCC警告我们that the array is not used,这意味着忽略了循环。

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

  

for-range-declaration = *__begin;

......这样的宣言显然是不合理的。

编辑:在reporting the bug之后,Paolo Carlini已将其修复为5.0版本。

1 个答案:

答案 0 :(得分:10)

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

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

  

迭代语句

     
      
  • ...
  •   
  • for ( for-range-declaration : for-range-initializer ) 声明
  •   
     

换范围声明

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

,它不允许在冒号之前使用初始化程序。