Visual Studio 2019中C类初始化报E0415错误原因咨询
为什么
const C CC = { 1 };会触发编译错误? 这个问题的核心在于C++聚合体(aggregate)的初始化规则,以及你的代码中A和C的本质区别:
1. 先看为什么const A AA = { 1 };可以正常编译
struct A是一个典型的聚合体,完全符合C++标准中聚合体的定义:
- 没有用户声明的构造函数
- 没有私有/保护的非静态数据成员
- 没有基类(C++17之前的要求)
- 没有虚函数
对于聚合体,C++允许直接用聚合初始化语法(也就是{})来初始化它的成员。这里{1}会直接匹配A的公共成员i,所以编译器能顺利完成初始化。
2. 再看const C CC = { 1 };出错的原因
struct C : public B<int>继承了基类B<int>,这就导致了关键差异:
- 在C++17之前的标准中,聚合体的定义明确排除了带有基类的类型,所以
C不是聚合体,不能使用聚合初始化语法。 - 因为
C不是聚合体,编译器会尝试寻找能接受int参数的构造函数来匹配{1},但C和它的基类B<int>都没有定义这样的构造函数(B<int>只有默认构造函数,支持聚合初始化但没有B(int)形式的构造函数),因此编译器抛出了no suitable constructor exists的错误。
如果使用C++17及之后的标准呢?
即使C++17放宽了聚合体规则,允许带有public基类的类型成为聚合体,你也不能直接写{1}来初始化C。此时聚合初始化需要先处理基类部分,正确的写法应该是嵌套初始化:
const C CC = { {1} }; // C++17及以后可行,外层{}初始化C,内层{}初始化基类B<int>的成员
但你的VS2019如果默认使用C17之前的标准(比如C14),即使这么写也会报错,因为此时C根本不被视为聚合体。
总结
你遇到的错误本质是:
C因为有基类,在C++17前不属于聚合体,无法用{1}做聚合初始化- 同时不存在能接受
int的构造函数,导致编译器无法完成初始化
内容的提问来源于stack exchange,提问作者dBags
相关产品推荐
相关产品推荐

