9.5 [class.union] の読み取り:
共用体の使用を簡素化するために、1 つの特別な保証が行われます。標準レイアウト共用体に、共通の初期シーケンス (9.2) を共有する複数の標準レイアウト構造体が含まれている場合、およびこの標準レイアウト共用体型のオブジェクトに次のいずれかが含まれている場合。標準レイアウトの構造体では、標準レイアウトの構造体メンバーの共通の初期シーケンスを検査することが許可されています。
構造体T
およびT_owner
は、スカラー ( の場合T
) または標準レイアウトの構造体 ( の場合T_owner
) 型のメンバーのみを持ち、9/7 で指定された他の (この議論にはあまり関係のない) 制約に違反していないため、標準レイアウトの構造体です。
9.2/19 は、共通の初期シーケンスがある場合を指定します。
2 つの標準レイアウト構造体は、対応するメンバーがレイアウト互換の型を持ち、どちらのメンバーもビット フィールドではないか、両方が 1 つ以上の初期メンバーのシーケンスに対して同じ幅のビット フィールドである場合、共通の初期シーケンスを共有します。
この段落は、実際には共通の初期シーケンスがないT
ことを示していると解釈します。 の最初のメンバーはでありint
、 の最初のメンバーはT_owner
ですT
。私の知る限り、これら2つのタイプは標準の定義によるレイアウト互換性がないため、技術的には「それはできません」というのが答えです。
あなたが確かにできることはこれです:
union T_union {
T t1;
T t2;
};
int main() {
T_union un;
un.t1.a = 10;
cout << un.t2.a << endl;
return 0;
}
もちろん実際には、コンパイラがここで正しいことをしない可能性はほとんどありません。