【发布时间】:2018-03-19 17:29:58
【问题描述】:
模板
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中的<=>。 -
在
<=>的讨论中,一个流行实现的维护者表示,他们的编译器无法合成<=>的整个类类型结果。合成整个类模板似乎更加遥不可及。 -
@paxdiablo
std::cout具有用户定义对象的语义。std::initializer_list没有,语言规则有很多可笑的特殊情况来适应它。 -
Ftr,相关提案是here,虽然我没有找到措辞的理由。
标签: c++ header-files c++-standard-library stdinitializerlist