12

最终的 C++11 标准包括对基于范围的 for 的规定,以便对本机数组“正常工作”,而无需包含<iterator>或任何其他标头。据我所知,这首先在工作文件n2900中作为评论 UK 78 和 79 的结果得到解决。

该提案还包括#include <initializer_list>在每个翻译单元中隐含的规定,例如,程序

#include <iostream>

int main()
{
    for (auto i : { 1, 2, 3, 4, 5 })
        std::cout << i << "\n";
}

即使不包括 . 也会符合标准<initializer_list>

但是,当从 C++11 中删除概念时,基于范围的 for 进行了修改,如n2930 所示。虽然保留了数组“正常工作”的规定,但没有提到初始化列表也是如此;事实上,各种标准库容器头文件的规范#include <initializer_list>和 8.5.4.2 的最终文本对我来说是相反的。

据我所知,这与该主题的最终措辞非常接近。那么,关于最终标准,上述程序是否格式正确,或者我是否需要#include <initializer_list>在基于范围的情况下使用它?换句话说,根据std::initializer_listFDIS 的 8.5.4.2,在基于范围的 for 中使用初始化列表是否构成“使用 --- 甚至是未命名类型的隐式使用”?

4

2 回答 2

8

我会说是的。根据 §6.5.4[stmt.ranged]/1,声明

for (auto i : { 1, 2, 3, 4, 5 })
    ...

就相当于

auto&& __range = { 1, 2, 3, 4, 5 };
...

这意味着initializer_list<int>使用了一个,并且<initializer_list>需要包含标题。

于 2012-01-18T18:48:22.057 回答
3

<initializer_list>如果不包含GCC 7.1,则会产生以下错误:

error: deducing from brace-enclosed initializer list requires #include <initializer_list>
     for (auto i : { 1, 2, 3, 4, 5 })
                                   ^

要看到这个错误,应该省略<iostream>,因为包括<iostream>也会包括<initializer_list>

于 2018-07-16T09:27:13.083 回答