作为参数的空初始值设定项列表不调用默认构造函数

Empty initializer list as argument doesn't call default constructor

以下代码

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

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

此外,我理解为什么 A obj { {} } 总是会调用带有一个参数的构造函数,因为我们传递的是一个空参数 initializer_list

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

A obj({}); 中大括号括起来的括号表示如果可能,将调用单参数构造函数。在这种情况下,这是可能的,因为空的初始化列表或 braced-init-list 可用于值初始化 int,因此调用单参数构造函数i=0.

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