【发布时间】:2013-02-18 09:05:24
【问题描述】:
为什么std::initializer_list 不是内置的核心语言?
在我看来,它是 C++11 的一个非常重要的特性,但它没有自己的保留关键字(或类似的东西)。
相反,initializer_list 它只是标准库中的一个模板类,它具有来自新 braced-init-list映射 /em> {...} 由编译器处理的语法。
乍一看,这个解决方案很hacky。
现在 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和&
它们都已经是语言的一部分。我只写了我最初的 3 个想法,我相信还有许多其他方法。
【问题讨论】:
-
标准委员会讨厌添加新关键字!
-
这个我明白了,但是如何扩展语言有很多可能性(关键字只是一个例子)
-
std::array<T>不比std::initializer_list<T>更“语言的一部分”。这些几乎不是该语言所依赖的唯一库组件。见new/delete、type_info、各种异常类型、size_t等 -
@Elmes:我会建议
const T(*)[N],因为它的行为与std::initializer_list的工作方式非常相似。 -
This 回答了为什么
std::array或静态大小的数组不太理想。
标签: c++ c++11 std initializer-list