以下代码
class A {
public:
A() {} // default constructor
A(int i) {} // second constructor
};
int main() {
A obj({});
}
调用第二个构造函数。可能将空initializer_list
视为一个参数并转换为int
。但是当你从类中删除第二个构造函数时,它会调用默认的构造函数。为什么呢?
另外,我理解为什么A obj { {} }
将始终使用一个参数调用构造函数,因为我们传递的是一个空initializer_list
的参数。
答案 0 :(得分:5)
A obj({});
中括号周围括号的出现表示如果可能,将调用单个参数构造函数。在这种情况下,可以使用空的初始化列表或 braced-init-list 来初始化int
,因此使用{{1}调用单个参数构造函数}}
删除单个参数构造函数时,i=0
无法再调用默认构造函数。但是,A obj({});
可用于默认构造{}
,然后可以调用复制构造函数来初始化A
。您可以通过添加obj
来确认这一点,但代码将无法编译。
答案 1 :(得分:0)
这是因为{}
中的A obj({});
最终被解释为类型int
。因此代码最终与A obj(0);
类似。