通过标准,在具有结构的对象的并集中,它只包含一个这个对象,它们肯定会相互匹配吗? 以下代码是否适用于所有类型?
#include <iostream>
using namespace std;
struct T {
int a;
float b;
// many other types...
};
union T_union {
T t1;
struct T_owner {
T t;
} t2;
};
int main() {
T_union un;
un.t1.a = 10;
cout << un.t2.t.a << endl; // I can always do that?
return 0;
}
答案 0 :(得分:0)
9.5 [class.union]读取:
为简化工会的使用,我们做出了一项特殊保证: 如果标准布局联合包含多个标准布局结构 共享一个共同的初始序列(9.2),如果是一个对象 标准布局联合类型包含标准布局之一 结构,允许检查任何共同的初始序列 标准布局结构成员。
结构T
和T_owner
是标准布局结构,因为它们只有标量(用于T
)或标准布局结构(用于T_owner
)类型的成员和没有违反9/7中指定的其他(与本讨论无关)约束。
9.2 / 19指定何时存在共同的初始序列:
两个标准布局结构共享一个共同的初始序列if 相应的成员具有布局兼容类型,两者都没有 member是一个位字段,或者两者都是具有相同宽度的位字段 一个或多个初始成员的序列。
我将此段解释为实际上没有共同的初始序列:T
的第一个成员是int
,而{{1}的第一个成员是T_owner
。 AFAIK这两种类型与标准的定义没有布局兼容,所以从技术上讲,答案是“你做不到”。
你当然能做到的是:
T
当然在实践中,任何编译器都不太可能在这里做正确的事情。