Warum steigern ist :: variant Betreiber nicht bieten! =
-
20-08-2019 - |
Frage
Bei zwei identischen boost::variant
Instanzen a
und b
, der Ausdruck ( a == b )
erlaubt ist.
Allerdings ( a != b )
scheint nicht definiert zu werden. Warum ist das?
Lösung
Ich denke, es ist einfach nicht in die Bibliothek aufgenommen. Der Boost.Operators wird nicht wirklich helfen, weil entweder Variante von boost :: Operator :: equality_comparable abgeleitet worden wäre. David Pierre ist richtig zu sagen, Sie verwenden können, aber Ihre Antwort ist auch richtig, dass der neue Betreiber! = Nicht von ADL gefunden werden, so dass Sie einen mit dem Operator benötigen.
Ich würde bitten, dies auf der Boost-Benutzer-Mailingliste.
Bearbeiten von @ AFoglia Kommentar:
Sieben Monate später, und ich studiere Boost.Variant, und ich stolpere über diese bessere Erklärung der Auslassung Listen.
http://boost.org/Archives/boost/2006/06/ 105895.php
operator==
ruft operator==
für die aktuelle Klasse zur Zeit in der Variante. Ebenso ruft operator!=
sollte auch operator!=
der Klasse aufrufen. (Denn theoretisch kann eine Klasse definiert werden, so a!=b
nicht das gleiche wie !(a==b)
ist.) Also, dass eine weitere Anforderung hinzufügen würde, dass die Klassen in der Variante eine operator!=
haben. (Es gibt eine Debatte darüber, ob man diese Annahme in der Mailing-Liste Thread machen kann.)
Andere Tipps
Dies ist einen Link auf die Antwort vom Autor selbst , wenn diese Frage auf Boost-Mailingliste formuliert wurde
Fasst es, in der Autor Meinung, Vergleichsoperator Umsetzung (! = Und <) würde mehr Anforderungen an den Typen hinzufügen verwendet, um den Variantentyp zu erstellen.
ich mit seiner Sicht nicht jedoch zustimmen, da! = Kann auf die gleiche Art und Weise wie == implementiert werden, ohne notwendigerweise die möglichen Implementierungen dieser Operatoren versteckt für jede der verschiedenen Arten der Variante bilden
Weil es nicht nötig ist.
-Boost hat eine Bibliothek Operatoren, die definiert operator! = in der Bezeichnung des Operators ==