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
相关产品推荐
相关产品推荐

