You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:45:36