C++20中继承自其他结构体的struct如何使用指定初始化器?
结论
带继承的结构体可以使用指定初始化器,你的报错是写法不符合C++标准要求导致的。
报错原因
你原来的写法中,初始化列表第一个元素是无指定符的基类初始化列表,第二个元素是带.Tag指定符的成员初始化,违反了C++指定初始化的核心规则:同一个初始化列表中不能同时混用带指定符和不带指定符的初始化项,因此编译器会抛出混合初始化的报错。
正确写法
C++20允许使用基类的类名作为指定符来初始化基类子对象,你只需要给基类初始化部分补充对应的指定符即可:
int main() { struct TStruct1 { int Field1; int Field2; }; struct TStruct2 : TStruct1 { int Tag; }; TStruct2 t2{ // 基类子对象用类名作为指定符 .TStruct1 = { .Field1 = 1, .Field2 = 2, }, .Tag = 3 }; }
上述代码在GCC 10+、Clang 16+、MSVC 2019 16.10及以上版本均可正常编译通过。
补充规则
- 只有聚合类型才能使用包含指定初始化在内的聚合初始化语法,你的示例中两个结构体都符合C++20聚合类型要求:公开非虚继承、无用户声明的构造函数、无私有/保护非静态数据成员、无虚函数
- 如果派生类有多个基类,每个基类子对象都需要用对应的类名作为指定符完成初始化
内容的提问来源于stack exchange,提问作者vladon
相关产品推荐
相关产品推荐

