繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM