最终的 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>
甚至在基于范围的情况下使用它?换句话说,在基于范围的 for 中使用初始化列表是否构成“使用std::initializer_list
---甚至是根据 FDIS 8.5.4.2 未命名类型的隐式使用?
我会说是的。根据§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>
需要包含标题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)