我似乎在GCC遇到了一个奇怪的错误。考虑
for (int i = 5 : {1, 2, 3})
std::cout << i << ", ";
虽然这个荒谬的代码是correctly rejected by Clang,it compiles and executes fine on all recent GCC versions。奇怪的是,根本没有产生1, 2, 3
和5, 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版本。
答案 0 :(得分:10)
这两个示例都是无效的语法,需要诊断。
基于范围的for的语法是6.5 / 1:
迭代语句:
- ...
for (
for-range-declaration:
for-range-initializer)
声明换范围声明:
- attribute-specifier-seq opt decl-specifier-seq 声明者
,它不允许在冒号之前使用初始化程序。