web-dev-qa-db-ja.com

unionでstd :: variantを使用する場所

unionstd::variantの違いと、なぜstd::variantが標準に導入されたのかを説明してください。どのような状況で、旧式のunionよりもstd::variantを使用する必要がありますか?

43
user7466998

一般的に、次のいずれかが発生しない限り、variantを優先する必要があります。

  1. あなたは浮気しています。型パニングまたはその他のUBを実行していますが、コンパイラがコードを壊さないことを望んでいます。

  2. C++ unionsが許可されている疑似パンナリーのいくつかを実行しています:レイアウト互換型間または共通の初期シーケンス間の変換。

  3. 簡単なコピー機能やレイアウトの互換性が明示的に必要です。 variant<Ts>には、特定のレイアウトや簡単なコピー機能は必要ありません。標準レイアウトタイプのunionsは標準レイアウトであり、簡単にコピー可能なタイプのunionsは簡単にコピーできます。

    コンポーネントタイプが簡単にコピー可能な場合、variantを簡単にコピーできるようにする提案 があることに注意してください。 C++ 17に対する欠陥レポートとして提案されているため、この動作は事実上C++ 17にバックポートされます。

  4. オブジェクトのインプレーススイッチングの低レベルのサポートが必要です。そのようなことのためにメモリバッファを使用しても、unionから抜け出すことができる簡単なコピーの保証は提供されません。

2つの基本的な違いは、variantがどのタイプを格納するかを知っている一方で、unionは追跡することを期待していることです。その外部。したがって、variant内の間違ったアイテムにアクセスしようとすると、例外またはnullptrが発生します。対照的に、unionを使用してそうすることは、単に未定義の動作です。

unionは低レベルのツールであるため、その低レベルが絶対に必要な場合にのみ使用してください。

variantには、訪問を行うための機構もあります。つまり、「タイプXの場合、これを行います。タイプYの場合、これを行う」という一連のifステートメントを避けることができます。それなど」。

65
Nicol Bolas