C++/Initializer list
<initializer_list> 是w:C++標準程式庫中的一個w:头文件,定义了w:C++标准中一个非常轻量级的表示初始化器列表的类模板initializer_list及有关函数。
类模板initializer_list
[编辑]类模板initializer_list用于访问初始化列表(initialization list),列表元素的数据类型为const T。编译器从花括号(brace)封闭的,元素由逗号分隔开的初始化列表自动构造initializer_list模板类。例如:
auto il = { 10, 20, 30 }; // the type of il is an initializer_list<int>
这些元素形成一个基础性的列表(underlying list),类模板initializer_list引用(refer to)但不包含这个列表的元素。复制这个initializer_list对象将引用到同一个基础列表而不是引用到基础列表的新的拷贝(引用语义reference semantics)。std::initializer_list并不是一个容器,不要用它传递期望长期存续的值。
构造函数的形参如果为一个initializer_list模板类,则这种特殊的构造函数称为初始化器列表构造函数(initializer-list constructor)。
struct myclass { myclass (int,int); myclass (initializer_list<int>); /* definitions ... */ }; myclass foo {10,20}; // calls initializer_list ctor myclass bar (10,20); // calls first constructor
注意,仅可以从braced-init-list推导出initializer_list<T>。这一过程中,编译器自动查询哪些构造函数可以用initializer_list<T>作为参数,并据此确定initializer_list的模板参数T的类型,从而对braced-init-list做类型转换,例如把字符串书面量"Hello world!"转换为string类,然后生成initializer_list<string>,最后再调用初始化器列表构造函数。C++标准规定禁止把初始化值窄化(narrow)以符合变量初始化所需的类型。例如:
int i {3.14}; //编译错误
C++11标准明确规定不能由模板参数推导出对应实参std::initializer_list的类型。[1]例如:
template<class T> void g(T); g({1,2,3}); // error: no argument deduced for T
成员类型
[编辑]- value_type :模板参数(T)
- reference :const T&
- const_reference :const T&
- size_type :size_t
- iterator :const T*
- const_iterator :const T*
成员函数
[编辑]- (constructor) :构造一个空的initializer_list
- size :返回list的大小
- begin :返回开始处的迭代器
- end :返回末端的迭代器
其他函数(模板)
[编辑]- begin (initializer_list) :返回开始处的迭代器
- end (initializer_list) :返回末端的迭代器
参考文献
[编辑]页面Template:ReflistH/styles.css没有内容。
- ↑ § 14.8.2.5/5 of the C++11 standard explicitly states that this is a non-deduced context for a template argument: A function parameter for which the associated argument is an initializer list (8.5.4) but the parameter does not have std::initializer_list or reference to possibly cv-qualified std::initializer_list type.