聚合初始化中引用其他成员的内联初始化是否为合法C++程序?
问题解答
代码合法性确认
这段代码是合法的C++程序,符合C++11及后续标准规范:
- 你定义的
Sheet结构体属于聚合类型:它没有用户声明的构造函数、没有私有/受保护的非静态数据成员、没有基类、没有虚函数,完全满足聚合类型的定义要求。 - C++11开始支持聚合类的非静态数据成员内联初始化(即你写的
int sum = std::accumulate(...)形式),同时聚合初始化语法也兼容这种带默认成员初始化器的场景。
初始化行为的核心规则
聚合初始化中,未被显式初始化的成员遵循以下行为逻辑:
- 如果初始化列表中没有为某个成员提供初始化值,该成员会执行它的默认成员初始化器(也就是你写的内联初始化代码)。
- 如果初始化列表中为该成员提供了空初始化器
{},则该成员会被值初始化(对于int这类基本类型来说就是零初始化),此时默认成员初始化器不会被执行。
对应代码场景分析
假设你的Sheet结构体定义如下:
#include <numeric> struct Sheet { int c[2]; int sum = std::accumulate(std::begin(c), std::end(c), 0); };
Sheet sheet2{{10,20}};:初始化列表仅初始化了第一个成员c,sum未被显式指定初始化值,因此执行默认成员初始化器,计算c的元素和得到30。Sheet sheet2{{10,20}, {}};:这里显式给sum传入空初始化器{},触发值初始化,int类型被置为0,因此sum结果为0,默认成员初始化器不会被调用。
内容的提问来源于stack exchange,提问作者3CEZVQ
相关产品推荐
相关产品推荐

