c – 为什么std :: initializer_list不是内置的语言?

为什么std :: initializer_list不是内核的核心语言?

在我看来,这是相当一个重要的功能,C 11,但它没有自己的保留关键字(或类似的东西)。

相反,initializer_list它只是一个来自标准库的模板类,它有一个特殊的隐式映射,来自编译器处理的新braced-init-list {…}语法。

起初认为,这个解决方案是相当黑客。

这是C语言新增加的方式现在将实现:通过一些模板类的隐含角色而不是核心语言?

请考虑这些例子:

   widget<int> w = {1,2,3}; //this is how we want to use a class

为什么要选择一个新课程:

   widget( std::initializer_list<T> init )

而不是使用类似于任何这些想法的东西:

   widget( T[] init, int length )  // (1)
   widget( T... init )             // (2)
   widget( std::vector<T> init )   // (3)

>一个经典数组,你可以在这里和那里添加const
>语言中已经存在三个点(var-args,现在是可变参数模板),为什么不重用语法(并使其感觉内置)
>只是一个现有的容器,可以添加const和&

所有这些都已经是语言的一部分。我只写了我的第一个想法,我相信有很多其他的方法。

已经存在在std命名空间中返回类型定义的“核心”语言特性的示例。 typeid返回std :: type_info和(可能扩展一点)sizeof返回std :: size_t。

在前一种情况下,为了使用这种所谓的“核心语言”功能,您已经需要包括一个标准头。

现在,对于初始化器列表,发生没有关键字需要生成对象,语法是上下文相关的大括号。除此之外,它与type_info相同。就个人而言,我不认为关键字的缺失使它“更黑客”。也许更奇怪的是,但记住,目标是允许相同的支撑初始化语法,已经允许的聚合。

所以是的,你可能期望更多的这种设计原则在未来:

>如果更多的情况下,可能引入新的功能,没有新的关键字,那么委员会将采取他们。
>如果新功能需要复杂类型,那么这些类型将被放置在std而不是内置。

因此:

>如果一个新的功能需要一个复杂的类型,可以没有新的关键字,那么你会得到你在这里,这是“核心语言”语法没有新的关键字,并使用std的库类型。

我认为,在“核心语言”和标准库之间没有C的绝对分割。它们在标准中是不同的章节,但每一个都引用另一个,它一直是这样。

在C 11中有另一种方法,即lambdas引入具有由编译器生成的匿名类型的对象。因为他们没有名字,他们根本不在命名空间,当然不在std。这不是一个合适的方法初始化列表,但是,因为你在使用类型名称,当你写的构造函数接受一个。

http://stackoverflow.com/questions/15198807/why-isnt-stdinitializer-list-a-language-built-in

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 为什么std :: initializer_list不是内置的语言?