【发布时间】:2014-11-19 23:20:59
【问题描述】:
我似乎在 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 版。
【问题讨论】:
-
不错的发现。您是否报告了该错误?
-
@Aleksandar 这可能不是一个错误,而只是未定义行为的结果,见上文。
-
不是UB,只是语法无效。 GCC 应该拒绝它,除非它有一个旨在处理它的扩展(这是极不可能的)。
-
故意不接受,请举报。 gcc.gnu.org/bugs - 谢谢!
-
@Columbo 作为旁注,我在使用 g++4.9.2 编译时得到输出 5。在 clang++ 下失败。
标签: c++ c++11 gcc for-loop g++