微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – #include需要使用基于范围的初始化程序列表?

最终的C11标准包括基于范围的规定,用于为本机阵列“正常工作”,而不必包括< iterator>或任何其他标题.据我所知,在工作文件 n2900中,由于英国78和79的评论,这一点首先得到了解决.

该提案还包含一个隐含#include< initializer_list>在每个翻译单元中,该程序

#include <iostream>

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

即使没有包含< initializer_list>将是标准的.

然而,当概念从C11中删除时,基于范围的修改n2930所示.尽管数组的“正常工作”规定仍然存在,但没有提到初始化列表也是如此;实际上,各种标准库容器头将#include< initializer_list>的规范而8.5.4.2的最终文本意味着与我相反.

据我所知,这与这个话题的最后措辞非常接近.那么,上面的程序是对最终标准的完善,还是需要#include< initializer_list>甚至使用它在一个基于范围的?换句话说,使用基于范围的初始化器列表是否构成了Fdis的每个8.5.4.2的“使用std :: initializer_list —即使是类型未命名的隐式用法”?

解决方法

我会说是的.根据§6.5.4[stmt.ranged] / 1,声明
for (auto i : { 1,5 })
    ...

只是相当于

auto&& __range = { 1,5 };
...

这意味着initializer_list< int>被使用,< initializer_list>标题需要包括在内.

原文地址:https://www.jb51.cc/c/113003.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐