作为参数的空初始值设定项列表不调用默认构造函数
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;
来确认这一点,代码将无法编译。
以下代码
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;
来确认这一点,代码将无法编译。