0

是不是按照标准,在对象与结构的联合中,只包含一个这个对象,它们肯定会相互匹配?以下代码是否适用于所有类型?

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

1 回答 1

0

9.5 [class.union] 内容如下:

一个特殊的保证是为了简化联合的使用:如果一个标准布局联合包含几个共享一个公共初始序列的标准布局结构(9.2),并且如果这个标准布局联合类型的对象包含以下之一标准布局结构,允许检查任何标准布局结构成员的公共初始序列。

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

9.2/19 规定何时有一个共同的初始序列:

如果对应的成员具有布局兼容的类型,并且两个成员都不是位域或两者都是一个或多个初始成员序列的具有相同宽度的位域,则两个标准布局结构共享一个共同的初始序列。

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

你当然可以做的是:

union T_union {
    T t1;
    T t2;
};

int main() {
    T_union un;
    un.t1.a = 10;
    cout << un.t2.a << endl;
    return 0;
}

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

于 2013-01-16T12:00:50.743 回答