0

このオブジェクトを 1 つだけ含む構造体を持つオブジェクトの結合では、標準で、それらは必ず一致するというのは本当ですか? また、次のコードはすべてのタイプで正しいですか?

#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] の読み取り:

共用体の使用を簡素化するために、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;
}

もちろん実際には、コンパイラがここで正しいことをしない可能性はほとんどありません。

于 2013-01-16T12:00:50.743 に答える