2012-01-18 25 views
10

最终的C++ 11标准包含基于范围的规定,以便为本地阵列“正常工作”,而不必包含<iterator>或任何其他头文件。据我所知,这首先是在工作文件n2900中作为评论UK 78和79的结果。#include <initializer_list>需要使用基于范围的初始化器列表吗?

该提案还包括在每个翻译单元中隐含#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_list ---即使是FDIS的每8.5.4.2中未指定类型的隐式使用”?

+2

很确定这是“是”。如果不是初始化器列表,你的循环还会迭代什么? – 2012-01-18 16:39:33

回答

6

我会说是的。根据§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>需要包括。

+0

这是我的怀疑,但它似乎有点不直观。有点让我想起C++ 03每本教科书如何使用'std :: endl',但只包含''而不是'iomanip'。 – 2012-01-19 14:29:12

相关问题