在联盟

时间:2016-01-08 12:39:31

标签: c++ undefined-behavior unions

我有这样的事情:

union DataXYZ
{
    struct complex_t
    {
        float real, imag;
    } complex;

    struct vector_t
    {
        float magnitude, phase;
    } vector;
};

我有一些这些的向量,是通用工作区内存,我在语义上下文之后相应地使用字段。

我知道,当最后一个活动成员是另一个字段(并且键入?)时,读取联合中的字段是未定义的行为。当类型和布局完全匹配时,这是否重要?

我一直在评论其他一些类似的问题,要求提供保证行为的参考资料,但还没有出现 - 因此这个问题。

1 个答案:

答案 0 :(得分:13)

您可以阅读特定情况中的其他成员。

这就是C ++ 11/14标准所说的:

  

9.5 - 工会

     

在联合中,最多一个非静态数据成员可以是活动的   在任何时候,也就是说,至多一个非静态数据的值   会员可以随时存入工会。

但是,该部分之后的注释使您的特定实例合法,因为为了简化工会的使用而做了一个特殊保证

  

[注意:如果标准布局联合包含多个标准布局   共享一个公共初始序列(9.2)的结构,以及一个对象   此标准布局联合类型包含标准布局之一   结构,允许检查任何共同的初始序列   标准布局结构成员;见9.2。 - 结束记录]

您的struct 分享一个共同的初始序列:

  

9.2.16 - 班级成员

     

两种标准布局的通用初始序列   struct(Clause 9)类型是非静态数据的最长序列   声明顺序中的成员和位字段,从第一个开始   每个结构中的这种实体,使得相应的实体   具有布局兼容类型,并且两个实体都不是位字段   或两者都是具有相同宽度的位字段。