我有这样的事情:
union DataXYZ
{
struct complex_t
{
float real, imag;
} complex;
struct vector_t
{
float magnitude, phase;
} vector;
};
我有一些这些的向量,是通用工作区内存,我在语义上下文之后相应地使用字段。
我知道,当最后一个活动成员是另一个字段(并且键入?)时,读取联合中的字段是未定义的行为。当类型和布局完全匹配时,这是否重要?
我一直在评论其他一些类似的问题,要求提供保证行为的参考资料,但还没有出现 - 因此这个问题。
答案 0 :(得分:13)
是您可以阅读特定情况中的其他成员。
这就是C ++ 11/14标准所说的:
9.5 - 工会
在联合中,最多一个非静态数据成员可以是活动的 在任何时候,也就是说,至多一个非静态数据的值 会员可以随时存入工会。
但是,该部分之后的注释使您的特定实例合法,因为为了简化工会的使用而做了一个特殊保证:
[注意:如果标准布局联合包含多个标准布局 共享一个公共初始序列(9.2)的结构,以及一个对象 此标准布局联合类型包含标准布局之一 结构,允许检查任何共同的初始序列 标准布局结构成员;见9.2。 - 结束记录]
您的struct
分享一个共同的初始序列:
9.2.16 - 班级成员
两种标准布局的通用初始序列 struct(Clause 9)类型是非静态数据的最长序列 声明顺序中的成员和位字段,从第一个开始 每个结构中的这种实体,使得相应的实体 具有布局兼容类型,并且两个实体都不是位字段 或两者都是具有相同宽度的位字段。