13

C++11 では、ユニオン内で非 POD 型を使用できるようになりました。次のコードがあるとします。

union
{
    T one;
    V two;
} uny;

私のクラスのどこかで、一度にアクティブなメンバーは 1 人だけですが、私の質問はかなり単純です。

  1. uny のデフォルト値は何ですか? - 未定義?
  2. クラスが破棄されるたびに、(ユニオン内の) どのメンバーが破棄されますか?
    • アクティブなメンバーを追跡するために std::typeinfo が必要だとしたら、デストラクタでそのメンバーに対して明示的にデストラクタを呼び出す必要がありますか?
  3. 非PODタイプを受け入れるようにユニオンを変更した言語提案へのリンクを持っている人はいますか?
4

3 に答える 3

16

あなたはほとんど一人でいます。標準の注記はこれを説明しています (9.5/2):

共用体の非静的データ メンバーに、非自明な既定のコンストラクタ (12.1)、コピー コンストラクタ (12.8)、移動コンストラクタ (12.8)、コピー代入演算子 (12.8)、移動代入演算子 (12.8)、またはデストラクタ ( 12.4)、共用体の対応するメンバー関数はユーザーが提供する必要があります。そうしないと、共用体に対して暗黙的に削除されます (8.4.3)。

したがって、メンバ コンストラクタのいずれかが非自明である場合は、共用体のコンストラクタを記述する必要があります (それらがすべて自明である場合、既定の状態は for のように初期化されませんunion { int; double; })。メンバーにデストラクタがある場合は、アクティブな要素を把握する必要がある共用体のデストラクタを作成する必要があります。

制約のない共用体の典型的な使用法に関する追加のメモ (9.5/4) があります。

一般に、共用体のアクティブなメンバーを変更するには、明示的なデストラクタ呼び出しと新しい演算子の配置を使用する必要があります。

于 2013-11-04T09:10:07.963 に答える
1

ユニオンの代替:

std::any/ std::variant (C++17)

boost::any/boost::variant

これらにより、POD 以外のデータ型を使用できます。

于 2016-10-11T11:13:36.370 に答える
0

難しい質問です。

これを使用できるかもしれません:

uny un;
new(&un.one) T;

https://en.cppreference.com/w/cpp/language/unionを参照でき ます

于 2021-11-02T11:30:34.637 に答える