## 列表初始化 C++11之前的编译器可能对列表初始化不够友好,但是在C++11中,列表初始化得到进一步的推广,现在任何对象类型都可以被列表初始化了,比如数组和不带构造函数的结构体。 ```C++ //这两种列表初始化是等同的。 vector v{"foo", "bar"}; vector v = {"foo", "bar"}; //可以配合 new 一起使用。 auto p = new vector {"foo", "bar"}; //多参数的类型。 map m = {{1, "one"}, {2, "two"}}; //初始化列表可迭代。 for (int i : {-1, 0, 1, 2, 3}) {} //函数调用里也可以使用初始化列表。 void TestFunction2(vector v) {} TestFunction2({1, 2, 3, 4}); ``` 用户自定义类型也可以定义接收 `std::initializer_list` 的构造函数和赋值运算符,以自动列表初始化。 ```C++ class MyTape { public: //std::initializer_list 专门接收 init 列表得以值传递。 MyType(std::initializer_list init_list){ for (int i : init_list) append(i); } MyType& operator=(std::initializer_list int_list){ clear(); for (int i:init_list) append(i); } }; MyType m{2, 3, 4, 5, 7}; ``` 最后,列表初始化也适用于常规数据类型的构造,哪怕没有接收 `std::initializer_list` 的构造函数。 ```C++ double d{1.23}; class MyOtherType { public: explicit MyOtherType(string); MyOtherType(int, string); }; MyOtherType m = {1, "b"}; //不过如果构造函数是显式的(explict),您就不能用 `= {}` 了。 MyOtherType m{"b"}; ``` 千万别直接列表初始化 auto 变量,看下一句,估计没人看得懂。 ```C++ auto d = {3.14}; auto d = double{1.23}; //这样才懂 ```