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而言,直接调用这一包东西的构造函数即可。

 

原文地址:https://www.cnblogs.com/SunShine-gzw/p/13225697.html