【问题标题】:What is the rationale for requiring inclusion of <initializer_list>?要求包含 <initializer_list> 的理由是什么?
【发布时间】:2018-03-19 17:29:58
【问题描述】:

来自[dcl.init.list]

模板std​::​initializer_­list 未预定义;如果在使用 std​::​initializer_­list 之前没有包含标头 ——即使是未命名类型的隐式使用——程序格式错误。

既然std​::​initializer_­list 无论如何都被编译器特例化了,为什么它不被视为语言的一流语法?

我对一些可能性及其反驳的看法:

命名空间污染

可以像std::size_t一样解决,只包含标题introduces the identifier

请注意 auto sz = sizeof(0); 即使不包含任何标题也是格式正确的,而不是 auto il = {1, 2, 3}; 格式错误。

编译开销

libstdc++std::initializer_list 实现实际上少于 50 行,并且不依赖于其他标头。这会有多大的开销?

【问题讨论】:

  • 也许是为了让旧代码避免隐式列表初始化,否则它会模棱两可或不受欢迎?
  • 另一个例子是typeid(需要std::type_info),以及C++2a中的&lt;=&gt;
  • &lt;=&gt; 的讨论中,一个流行实现的维护者表示,他们的编译器无法合成&lt;=&gt; 的整个类类型结果。合成整个类模板似乎更加遥不可及。
  • @paxdiablo std::cout 具有用户定义对象的语义。 std::initializer_list 没有,语言规则有很多可笑的特殊情况来适应它。
  • Ftr,相关提案是here,虽然我没有找到措辞的理由。

标签: c++ header-files c++-standard-library stdinitializerlist


【解决方案1】:

背后似乎没有道理。也许当时希望进一步的语言解析和修改允许实现,但现在这似乎并不现实。

在任何情况下,关于该论点的进一步阅读都可以找到here

【讨论】:

    猜你喜欢
    • 2015-01-25
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多