C++构造问题咨询:无自定义两参构造的基类为何支持多参数初始化
问题解答
你观察到的代码调用是合法的,这一现象的核心是C++的聚合初始化特性,和成员的默认初始化值有间接关联,具体原理如下:
核心前提:Renderable 是聚合类型
C++标准中符合以下条件的类属于聚合类型:
- 无用户声明的构造函数
- 无私有/受保护的非静态数据成员
- 无基类、无虚函数
你给出的Renderable结构体完全符合以上要求,因此支持聚合初始化语法。
聚合初始化的规则
聚合类型可以直接用花括号包裹的初始化列表按成员声明顺序初始化:
Renderable{uniform, nullptr}
这里的初始化逻辑是:
- 第一个参数赋值给第一个成员
uniform - 第二个参数赋值给第二个成员
geometry - 剩余未传入初始化参数的成员
alpha_blending、depth_test,会优先使用类内声明的默认初始化值true完成初始化
与默认成员初始化值的关系
类内的默认成员初始化值并不是让两参数初始化合法的核心原因,就算没有这两个默认值,两参数的聚合初始化写法依然是合法的,只是此时剩余的两个bool成员会被值初始化为false。默认成员初始化值的作用是保证未显式传参的成员也能获得符合业务预期的初始值,不需要每次初始化都手动传入所有参数。
内容的提问来源于stack exchange,提问作者speed_of_light
相关产品推荐
相关产品推荐

