有点相关我之前的问题:
数组的元素算作公共初始序列吗?
struct arr4 { int arr[4]; };
struct arr2 { int arr[2]; };
union U
{
arr4 _arr4;
arr2 _arr2;
};
U u;
u._arr4.arr[0] = 0; //write to active
u._arr2.arr[0]; //read from inactive
根据此 cpp 参考页面:
在具有非联合类类型 T1 的活动成员的标准布局联合中,允许读取非联合类类型 T2 的另一个联合成员的非静态数据成员 m,前提是 m 是公共初始序列的一部分T1和T2的......
这是合法的还是非法的双关语?
C++11 说 (9.2):
如果标准布局联合包含两个或多个共享公共初始序列的标准布局结构,
如果标准布局联合对象当前包含这些标准布局结构之一,则允许
检查其中任何一个的共同初始部分。两个标准布局结构共享一个共同的首字母
如果相应的成员具有布局兼容的类型,则序列并且两个成员都不是位字段或
对于一个或多个初始成员的序列来说,两者都是具有相同宽度的位字段。
至于不同大小的数组是否构成有效的公共初始序列,3.9说:
如果两个类型 T1 和 T2 是同一类型,则 T1 和 T2 是布局兼容类型
这些数组不是同一类型,因此这不适用。数组没有特殊的进一步例外,因此数组可能不兼容布局,并且不形成公共初始序列。
但实际上,我知道有一个编译器(GCC):
- 忽略“共同初始序列”规则,并且
- 无论如何都允许类型双关,但仅当访问“通过联合类型”时(如您的示例中所示),在这种情况下,间接遵守“公共初始序列”规则(因为“公共初始序列”意味着公共初始布局编译器支持的体系结构)。
我怀疑许多其他编译器也采取类似的方法。在您的示例中,您通过联合对象键入双关语,此类编译器将为您提供预期的结果 - 从非活动成员读取应该为您提供通过非活动成员写入的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)