[英]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
。 但是当你从类中删除第二个构造函数时,它会调用默认的构造函数。 为什么?
另外,我理解为什么A obj { {} }
总是会调用带有一个参数的构造函数,因为我们传递的是一个空的initializer_list
参数。
A obj({});
括号周围括号的存在A obj({});
表示如果可能,将调用单个参数构造函数。 在这种情况下,有可能因为空初始化列表或braced-init-list可用于初始化int
值,因此使用i=0
调用单个参数构造函数。
当你删除单个参数构造函数时, A obj({});
不能再调用默认构造函数。 但是, {}
可用于默认构造A
,然后可以调用复制构造函数来初始化obj
。 您可以通过添加A(const A&) = delete;
来确认这一点A(const A&) = delete;
,代码将无法编译。
这是因为{}
中的A obj({});
最终被解释为int
类型。 所以代码最终类似于A obj(0);
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.