Wea*_*ish 12 c++ arrays unions language-lawyer
与我之前的问题相关的排序:
数组元素是否算作一个常见的初始序列?
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
Run Code Online (Sandbox Code Playgroud)
在具有非联合类类型T1的活动成员的标准布局并集中,允许读取非联合类类型T2的另一个联合成员的非静态数据成员m,前提是m是公共初始序列的一部分T1和T2 ......
这是合法的,还是非法类型的惩罚?
C++ 11说(9.2):
如果标准布局联合包含两个或多个共享公共初始序列的标准布局结构,并且如果标准布局联合对象当前包含这些标准布局结构中的一个,则允许检查任何公共初始部分.他们 如果相应的成员具有布局兼容类型并且两个成员都不是位字段,或者两者都是具有相同宽度的位字段(对于一个或多个初始成员的序列),则两个标准布局结构共享共同的初始序列.
至于不同大小的数组是否形成有效的公共初始序列,3.9说:
如果两种类型T1和T2是相同类型,则T1和T2是布局兼容类型
这些数组的类型不同,因此不适用.对于数组没有特殊的进一步例外,因此数组可能不是布局兼容的,并且不形成公共的初始序列.
但实际上,我知道编译器(GCC):
我怀疑许多其他编译器采取了类似的方法.在你的例子中,你通过union对象输入pun,这样的编译器会给你预期的结果 - 从非活动成员读取应该给你通过非活动成员写的值.