【发布时间】:2017-06-26 14:33:31
【问题描述】:
以下是该问题的精简版:
#include <initializer_list>
#include <iostream>
enum objects { zero, one, two, three, four, five, six, seven };
std::initializer_list<objects> objects_list()
{
return { zero, one, two, three, four, five, six, seven };
}
int main()
{
for (auto a : objects_list())
{
std::cout << a << ' ';
}
std::cout << '\n';
}
我的期望是程序输出:
0 1 2 3 4 5 6 7
这是 GCC 4.9.2 所确认的,但是来自其 git 存储库的新 GCC 会产生:
0 0 -85997960 32712 -1076836160 32765 0 32
这看起来基本上是随机数。
我的程序或 GCC 有问题吗?
【问题讨论】:
-
我从 5 月下旬开始使用 gcc 7.1.1,但无法重现。也许一些新的拉取请求引入了这个错误?
-
虽然在这里没关系,但当您不需要循环中的副本时,我总是更喜欢
for (const auto& a : ..... -
Can reproduce here。很奇怪。
-
std::initializer_list只是一个数组的“视图”(它是由编译器创建的临时对象,其生命周期由std::initializer_list延长,就像引用如何延长暂时的)。它不拥有该阵列。该程序所做的类似于返回对临时的引用。 -
只是 FWIW,我认为代码在 GCC 4.9.2 中运行良好是 GCC bug 70167 的症状,由 r247793 修复。