请问B b{ A() }是引用初始化还是聚合初始化?相关拷贝构造疑问
关于C++聚合初始化与拷贝构造函数的疑问解答
先看你给出的代码片段:
struct A {}; struct B : A{}; B b{ A() };
问题1:是否会调用隐式声明的B::B(const B&)?
不会。这段代码采用的是聚合初始化:
- 从C++17标准开始,
B属于聚合类型——它没有用户声明的构造函数、析构函数、赋值运算符,所有基类都是public的,也没有虚函数或私有/保护的非静态数据成员。 - 聚合初始化的逻辑是直接初始化对象的各个组成部分:这里用
A()生成的临时对象,直接初始化B的A基类子对象;由于B没有其他成员,整个初始化过程不需要调用任何B的构造函数,自然不会触发拷贝构造函数。
问题2:为何显式删除拷贝构造函数时程序不合法?
当你显式删除B的拷贝构造函数(例如B(const B&) = delete;),这个操作属于用户声明了构造函数,此时B不再满足聚合类型的定义条件,也就无法再使用聚合初始化语法。
- 此时编译器会尝试寻找能匹配
B b{A()}的构造函数,但B既没有接受A作为参数的构造函数,唯一存在的构造函数(被删除的拷贝构造)也无法将A临时对象转换为B类型;同时,由于用户声明了拷贝构造函数,B的默认构造函数也不会被隐式生成,最终导致初始化操作无法完成,程序因此不合法。
内容的提问来源于stack exchange,提问作者mada
相关产品推荐
相关产品推荐

