initializer_list
class A { public: A(int x=0,int y=0) { cout << "aaaaa" << endl; } }; int main() { A a(1,2); A b{1,2}; while (1); return 0; }
(箭头表示调用该构造函数)
这两种初始化都会成功编译通过,且调用同一个构造函数,但是为什么可以用{}初始化,编译器做了什么?
在C++11之后,标准库引入了initializer_list这个东西,我们可以把这个东西通俗的理解为一包东西(因为它可以装多个元素),如果通过{}来初始化,编译器首先显示的去寻找这一包东西的构造函数,如果没有,编译器就会为我们”解包“,把这一包东西打开来,变为一个个的元素,然后调用与这个元素类型相匹配且个数相同的构造函数。上面的例子就是没有显示定义这一包东西的构造函数,所以编译器会把{1,2}解包,然后调用A(int x=0,int y=0)这个构造函数。
下面是有这一包东西的情形:
class A { public: A(int x=0,int y=0) { cout << "aaaaa" << endl; } A(initializer_list<int> s) { cout << "bbb" << endl; } }; int main() { A a(1,2); A b{1,2}; while (1); return 0; }
(箭头表示调用该构造函数)
这里由于有这一包东西的显示构造,所以对于b而言,直接调用这一包东西的构造函数即可。