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