C++/Initializer list

维基教科书,自由的教学读本
< C++
跳到导航 跳到搜索

<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) :返回末端的迭代器

参考文献[编辑]

  • § 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.