作为参数的空初始化列表并不调用默认构造函数

时间:2018-03-18 17:24:04

标签: c++ c++11 list-initialization

以下代码

class A {
public:
    A() {} // default constructor
    A(int i) {} // second constructor
};
int main() {
    A obj({});
}

调用第二个构造函数。可能将空initializer_list视为一个参数并转换为int。但是当你从类中删除第二个构造函数时,它会调用默认的构造函数。为什么呢?

另外,我理解为什么A obj { {} }将始终使用一个参数调用构造函数,因为我们传递的是一个空initializer_list的参数。

2 个答案:

答案 0 :(得分:5)

A obj({});中括号周围括号的出现表示如果可能,将调用单个参数构造函数。在这种情况下,可以使用空的初始化列表或 braced-init-list 来初始化int,因此使用{{1}调用单个参数构造函数}}

删除单个参数构造函数时,i=0无法再调用默认构造函数。但是,A obj({});可用于默认构造{},然后可以调用复制构造函数来初始化A。您可以通过添加obj来确认这一点,但代码将无法编译。

答案 1 :(得分:0)

这是因为{}中的A obj({});最终被解释为类型int。因此代码最终与A obj(0);类似。