回答 これに対するSO質問:
C++標準ライブラリのboost :: Variantに相当するものは何ですか?
boost::variant
とstd::variant
は多少異なると言われています。
std::variant
を採用するために、委員会はどのような動機を表明しましたか?(動機は、C++ 17より前のコードでboost::variant
を使用することです)
割り当て/定置動作:
boost::variant
may 割り当てを実行するときにメモリを割り当てます ライブvariant
に。 これがいつ発生するかを管理するいくつかのルール があるため、boost::variant
がメモリを割り当てるかどうかは、インスタンス化されるTs
によって異なります。
std::variant
は決して動的にメモリを割り当てません。ただし、C++オブジェクトの複雑なルールへの譲歩として、割り当て/配置がスローされた場合、variant
mayは「 valueless_by_exception "状態。この状態では、variant
にアクセスできず、特定のメンバーにアクセスするための他の関数も機能しません。
この状態に入ることができるのは、割り当て/配置がスローされた場合のみです。
Boost.Variantにはrecursive_variant
が含まれています。これは variant
にそれ自体を含めることができます 。これらは本質的にboost::variant
へのポインターの特別なラッパーですが、訪問機構に関連付けられています。
std::variant
にはそのようなヘルパータイプはありません。
std::variant
は、C++ 11以降の機能をさらに活用します。例えば:
構成要素タイプの特殊メンバー関数のnoexcept
ステータスを転送します。
可変個引数テンプレートベースのインプレースコンストラクターと定置関数があります。
欠陥の解決 C++ 17に適用されると、そのタイプの些細なコピー可能性も転送される可能性があります 。つまり、すべてのタイプが簡単にコピーできる場合は、variant<Ts>
も簡単にコピーできます。
バリアントクラスの設計に関する主な論点は、バリアントへの割り当て(完了時に古い値を破棄する必要がある)が例外をスローしたときに何が起こるかということだったようです。
variant<std::string, MyClassWithThrowingDefaultCtor> v = "ABC";
v = MyClassWithThrowingDefaultCtor();
オプションは次のようです。
boost::variant
は明らかにします)。私が間違っていなければ、後者が受け入れられています。
これは、2015年11月のAxelNaumannによるISOC++ブログ post から要約されています。