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

C++标准中,访问联合体中与结构体成员同类型的成员是否为未定义行为?

C++标准下联合成员访问的未定义行为判定

针对你给出的代码示例:

struct Vec2{int x,y;};

union {
     Vec2 v;
     int x;
} u = {{0,0}}; // 初始化v成员

u.v.x; // 该操作定义明确
u.x;   // 此操作是否属于未定义行为?我访问的是同一类型,但真的合规吗?

根据C++标准的规定,u.x的访问属于未定义行为,原因如下:

  • 联合的活跃成员是最后一次被写入的成员,这里通过初始化确定活跃成员为v。
  • 标准仅允许在特定例外情况下访问联合的非活跃成员,比如:
    • 两个标准布局类类型的成员拥有匹配的公共初始序列,且访问的是该序列内的成员(但此规则仅适用于类类型成员之间,int是标量类型,不适用此例外);
    • 通过std::byte类型的指针访问联合对象的存储(这不属于直接访问非活跃成员的情况)。

你提到的GCC、Clang、MSVC将此作为扩展处理为合法行为,这是编译器提供的非标准特性,并非C++标准所规定的合规行为。而std::memcpy确实是标准允许的类型双关方式,因为它属于字节层面的复制操作,符合标准对对象存储访问的规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:37:17