一.探究std::initializer_list是什么?
我们观察下面代码:
- 根据输出结果“the type of il is an initializer_list”,我们可以知道 initializer_list是作为参数的构造函数
int main() { auto il = { 10, 20, 30 }; cout << typeid(il).name() << endl; 输出结果:the type of il is an initializer_list return 0; }
二.std::initializer_list使用场景(初始化容器对象,作为operator=的参数…)
- std::initializer_list一般是作为构造函数的参数
- C++11对STL中的不少容器 (vector,list,map…) 就 增加std::initializer_list作为参数的构造函数 ,这样初始化容器对象就更方便了
- std::initializer_list也可以作为operator=的参数 ,这样就可以用大括号赋值
三.对比【C++11特性{ }的隐式类型转换】&【调用initializer_list的vector构造函数】不同原理
- C++11中新增的关于{}用法 (传送门):具体对象是下面代码中Point, 直接调用两个参数的构造 – 隐式类型转换
- 我们vector容器构造函数的参数是std::initializer_list, 这里是调用initializer_list的vector构造函数
struct Point { //explicit Point(int x, int y)//调用后,可不让其隐式类型转换 Point(int x, int y) :_x(x) ,_y(y) { cout << "Point(int x, int y)" << endl; } int _x; int _y; }; int main() { // 不同的规则 vector<int> v1 = { 1,2,3,4,3}; // 调用initializer_list的vector构造函数 Point p1 = { 1,1}; // 直接调用两个参数的构造 -- 隐式类型转换 return 0; }