需要包含<initializer_list>的理由是什么?(这是一个提问标题,涉及IT技术相关内容)

28

来自[dcl.init.list]

模板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行,没有依赖其他头文件。那会有多大的开销呢?


3
也许是为了避免旧代码在隐式列表初始化时出现歧义或不期望的情况,所以需要这样做? - Useless
3
另一个例子是 typeid(需要 std::type_info),以及 C++2a 中的 <=> - Kerrek SB
6
<=> 的讨论中,一位受欢迎的实现维护者表示,他们的编译器无法合成完整的类类型结果。合成整个类模板似乎更加难以实现。 - T.C.
3
std::cout 具有用户自定义对象的语义,而 std::initializer_list 则没有,语言规则有过多的特例来适应它。 - Passer By
1
顺便提一下,相关提案在这里,但我没有找到措辞的理由。 - Baum mit Augen
显示剩余6条评论
1个回答

1
它似乎没有合理性。也许当时有希望进一步的语言解决方案和修改能够实现,但现在看来这并不现实。

无论如何,关于这个论点的进一步阅读可以在这里找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接