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

san*_*pta 6 c++ c++11 list-initialization

以下代码

class A {
public:
    A() {} // default constructor
    A(int i) {} // second constructor
};
int main() {
    A obj({});
}
Run Code Online (Sandbox Code Playgroud)

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

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

Pra*_*ian 5

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

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