boost :: variantが演算子!=を提供しない理由
-
20-08-2019 - |
質問
2つの同一のboost::variant
インスタンス a
および b
が与えられた場合、式 ( a == b )
が許可されます。
ただし、 ( a != b )
は未定義のようです。これはなぜですか?
解決
ライブラリに追加されていないだけだと思います。 Boost.Operatorsは、どちらのバリアントもboost :: operator :: equality_comparableから派生したため、実際には役に立ちません。 David Pierreはそれを使用できると言うのは正しいですが、あなたの応答も正しいです。新しい演算子はADLによって検出されないため、using演算子が必要になります。
boost-usersメーリングリストでこれを尋ねます。
@AFogliaのコメントから編集:
7か月後、Boost.Variantを勉強しています。この省略リストのより良い説明につまずきます。
http://boost.org/Archives/boost/2006/06/ 105895.php
operator==
は、現在バリアントにある実際のクラスのoperator!=
を呼び出します。同様に、a!=b
を呼び出すと、クラスの!(a==b)
も呼び出す必要があります。 (理論的には、<=>が<=>と同じではないようにクラスを定義できるため。)そのため、バリアント内のクラスに<=>が必要であるという別の要件が追加されます。 (メーリングリストのスレッドでこの仮定を立てることができるかどうかについては議論があります。)
他のヒント
これは、著者自身からの回答へのリンクこの質問がブーストメーリングリストで作成されたとき
要約すると、著者の意見では、比較演算子(!=および<!> lt;)を実装すると、バリアント型の作成に使用される型にさらに要件が追加されます。
ただし、!=は==と同じ方法で実装でき、バリアントを構成する各型のこれらの演算子の可能な実装を必ずしも隠すことなく、彼の観点に同意しません
必要がないため。
Boostには、 operatorsライブラリがあります。 operator!== operator ==