C++标准中何处规定静态数组的子对象为静态对象?
问题解答
代码示例
int main(void) { const int a{}; const int &r = a; static int arr[1] = {r}; constexpr const int &ref = arr[0]; // OK }
核心问题解答
1. 静态数组的元素是否为具有静态存储期的子对象?
是,静态数组的元素属于具有静态存储期的子对象。
2. C++标准中的相关规定
以C++标准草案N4868为例:
- 子对象存储期的继承规则:在
[basic.stc]章节明确规定,子对象的存储期与其所属的完整对象存储期一致。如果完整对象拥有静态存储期,那么它的所有子对象(包括数组元素、非静态数据成员等)都自动继承该存储期。 - 静态存储期的定义:
[basic.stc.static]中指出,静态存储期的对象在程序启动时分配内存,程序结束时释放内存;这类对象包括用static声明的块作用域对象、命名空间作用域对象等。 - 数组元素的属性:
[dcl.array]章节说明数组是聚合类型,每个数组元素都是数组的子对象。结合上述存储期继承规则,静态数组的元素必然属于具有静态存储期的子对象。
正是因为arr[0]作为静态数组arr的子对象拥有静态存储期,满足常量表达式对引用目标的存储期要求,所以constexpr const int &ref = arr[0]的初始化是合法的。
内容的提问来源于stack exchange,提问作者user20175049
相关产品推荐
相关产品推荐

