模板
std::initializer_list
没有被预定义;如果在使用std::initializer_list
之前未包含头文件<initializer_list>,即使在未命名类型的隐式使用中,程序也是不合法的。
既然编译器已经对std::initializer_list
进行了特殊处理,为什么它不被视为语言的一级语法呢?
以下是我对某些可能性和相应的反驳的想法:
命名空间污染
可以像std::size_t
一样解决,只需包括头文件即可引入标识符。
请注意,auto sz = sizeof(0);
即使没有包含任何头文件,也是合法的,而auto il = {1, 2, 3};
则无效。
编译开销
libstdc++实现std::initializer_list
只有不到50行,没有依赖其他头文件。那会有多大的开销呢?
typeid
(需要std::type_info
),以及 C++2a 中的<=>
。 - Kerrek SB<=>
的讨论中,一位受欢迎的实现维护者表示,他们的编译器无法合成完整的类类型结果。合成整个类模板似乎更加难以实现。 - T.C.std::cout
具有用户自定义对象的语义,而std::initializer_list
则没有,语言规则有过多的特例来适应它。 - Passer By