文章参考:侯捷-C++11新特性
下篇文章:initializer_list
1 出现原因
在C++11之前,程序员或新手可能很困惑于一件事情:如何初始化一个变量或者一个对象,因为这种初始化可能发生在小括号()
、大括号{}
、赋值运算符=
上。
2 如何使用
基于这个原因,C++11导入了“Uniform Initialization(一致性初始化)”,即:任何初始化都可以使用大括号来实现,在变量的后面直接写{}
,在内部放入初值即可。
3 实现原理
大括号{}
赋初值的实现原理:
- 首先,编译器看到参数列表
{t1, t2, ..., tn}
便会在幕后根据它们的数据类型自动生成一个initializer_list<T>
(它的幕后其实是一个array<T,n>
); - 之后,调用函数(例如ctor)时该
array
内的元素可被编译器分解并逐一地传给该函数; - 当然,如果该函数的参数本身就是
initializer_list<T>
,调用者就不能给予数个T参数然后以为它们会被自动转换为一个initializer_list<T>
而传入;
对于所有容器而言,它们都有一个ctor是可以直接接受initializer_list<T>
参数的版本,而自己写的类不一定有这个版本,那么编译器就会自动将initializer_list<T>
内的参数一个一个传入。