是否真的在对象与结构的并集中,它只包含一个这个对象,它们肯定会相互匹配?

时间:2013-01-16 11:40:51

标签: c++

通过标准,在具有结构的对象的并集中,它只包含一个这个对象,它们肯定会相互匹配吗? 以下代码是否适用于所有类型?

#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;
}

1 个答案:

答案 0 :(得分:0)

9.5 [class.union]读取:

  

为简化工会的使用,我们做出了一项特殊保证:   如果标准布局联合包含多个标准布局结构   共享一个共同的初始序列(9.2),如果是一个对象   标准布局联合类型包含标准布局之一   结构,允许检查任何共同的初始序列   标准布局结构成员。

结构TT_owner是标准布局结构,因为它们只有标量(用于T)或标准布局结构(用于T_owner)类型的成员和没有违反9/7中指定的其他(与本讨论无关)约束。

9.2 / 19指定何时存在共同的初始序列:

  

两个标准布局结构共享一个共同的初始序列if   相应的成员具有布局兼容类型,两者都没有   member是一个位字段,或者两者都是具有相同宽度的位字段   一个或多个初始成员的序列。

我将此段解释为实际上没有共同的初始序列:T的第一个成员是int,而{{1}的第一个成员是T_owner。 AFAIK这两种类型与标准的定义没有布局兼容,所以从技术上讲,答案是“你做不到”。

你当然能做到的是:

T

当然在实践中,任何编译器都不太可能在这里做正确的事情。