我有这样的事情:
union DataXYZ
{
struct complex_t
{
float real, imag;
} complex;
struct vector_t
{
float magnitude, phase;
} vector;
};我有一些向量,作为通用的工作区内存,在语义上下文之后,我相应地使用字段。
我知道,当最后一个活动成员是另一个字段(并键入?)时,在联合中读取字段是一种未定义的行为。当类型和布局完全匹配时,这有关系吗?
我一直在评论其他一些类似的问题,要求提供能保证这种行为的参考资料,但目前还没有出现任何问题--因此,我提出了这个问题。
发布于 2016-01-08 12:51:23
是的,,,您可以阅读中的其他成员,特别是。
这就是C++11/14标准所要指出的:
9.5 -工会 在一个联合中,最多一个非静态数据成员可以在任何时候都是活动的,也就是说,最多一个非静态数据成员的值可以在任何时候存储在一个联合中。
但本节后面的注释使您的特定实例成为合法,因为为了简化工会的使用,提供了一个特殊的保证。
注意:如果标准布局联合包含多个共享公共初始序列( 9.2 )的标准布局结构,并且如果此标准布局联合类型的对象包含标准布局结构之一,则允许检查任何标准布局结构成员的公共初始序列;请参见9.2。-end注记
您的struct的确实共享了一个公共的初始序列:
9.2.16 -班级成员 两种标准布局结构(第9条)类型的公共初始序列是非静态数据成员和位字段按声明顺序排列的最长序列,从每个结构中的第一个这样的实体开始,这样相应的实体具有与布局兼容的类型,或者没有实体是位字段,或者两者都是相同宽度的位字段。
https://stackoverflow.com/questions/34677343
复制相似问题