You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 01:06:30