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

C++联合体中公共初始序列与嵌套结构体的交互问题

C++联合体公共初始序列规则与嵌套结构体的交互分析

C++标准中关于标准布局联合体的公共初始序列规则如下:

在标准布局联合体中,若活跃成员为结构体类型T1,允许读取另一结构体类型T2成员的非静态数据成员m,前提是m属于T1和T2的公共初始序列;其行为等效于引用T1的对应成员。

针对你给出的代码示例,我们逐一分析问题:

先看类型定义:

struct A
{
  int a1, a2;
};

struct S
{
  A s1, s2;
};

struct B
{
  int b1, b2, b3, b4;
};

union U
{
  S s;
  B b;
};

核心判定逻辑

两个标准布局结构体的公共初始序列,是从第一个成员开始的最长连续成员序列,要求每个对应位置的直接成员必须是布局兼容的类型。布局兼容的前提是类型本身的内存布局匹配——比如同类型的基本数据、布局完全一致的标准布局结构体等。

针对你的问题的结论

  1. S和B不存在公共初始序列:S的第一个直接成员是结构体A,B的第一个直接成员是基本类型int,二者内存布局完全不同,不属于布局兼容类型,因此连第一个成员都无法纳入公共初始序列,整个序列长度为0。
  2. 当活跃成员为u.b时,访问u.s.s1.a1、u.s.s1.a2、u.s.s2.a1、u.s.s2.a2全都是未定义行为——这些成员都不属于S和B的公共初始序列(根本不存在)。
  3. 你代码中u.s.s1.a1 = 1;之后访问u.b.b1 == 1;同样是未定义行为,理由同上:b1不在S和B的公共初始序列范围内。

如果想要让S和B拥有公共初始序列,需要调整结构使二者的直接成员从第一个开始就布局兼容——比如让S的第一个成员改为int,或者让B的第一个成员改为A。

内容的提问来源于stack exchange,提问作者kc9jud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:03:26