16

2つの同一のboost::variantインスタンスaとが与えられるとb、式( a == b )は許可されます。

しかし( a != b )、未定義のようです。どうしてこれなの?

4

3 に答える 3

12

ライブラリに追加されていないだけだと思います。Boost.Operatorsは、どちらのバリアントもboost :: operator :: equality_comparableから派生しているため、実際には役に立ちません。David Pierreはあなたがそれを使うことができると言うのは正しいです、しかしあなたの応答も正しいです、新しい演算子!=はADLによって見つけられないので、あなたはusing演算子を必要とするでしょう。

ブーストユーザーのメーリングリストでこれを聞いてみます。

@AFogliaのコメントから編集:

7か月後、私はBoost.Variantを研究していますが、省略リストのこのより良い説明に出くわしました。

http://boost.org/Archives/boost/2006/06/105895.php

operator==operator==現在バリアントにある実際のクラスを呼び出します。同様に、呼び出しはクラスの呼び出しでoperator!=もあります。operator!=(理論的には、クラスを定義できるためa!=b、と同じではありません!(a==b)。)したがって、バリアント内のクラスに。が含まれているという別の要件が追加されますoperator!=。(メーリングリストのスレッドでこの仮定を行うことができるかどうかについては議論があります。)

于 2009-06-25T21:19:47.620 に答える
3

これは、この質問がブーストメーリングリストで作成されたときの作者自身からの回答へのリンクです。

要約すると、著者の意見では、比較演算子(!=および<)を実装すると、バリアント型の作成に使用される型にさらに要件が追加されます。

ただし、彼の見解には同意しません。なぜなら、!=は==と同じ方法で実装でき、バリアントを構成するタイプごとにこれらの演算子の可能な実装を必ずしも隠す必要がないからです。

于 2012-02-26T03:34:51.273 に答える
2

する必要がないからです。

Boostには、operator!=をoperator==の観点から定義する演算子ライブラリがあります。

于 2009-06-25T15:09:35.263 に答える