Perché boost :: variant non fornisce l'operatore! =
-
20-08-2019 - |
Domanda
Dato due boost::variant
istanze a
e b
identiche, è consentita l'espressione ( a == b )
.
Tuttavia ( a != b )
sembra essere indefinito. Perché questo?
Soluzione
Penso che non sia stato aggiunto alla libreria. Boost.Operators non sarà di grande aiuto, poiché entrambe le varianti sarebbero state derivate da boost :: operator :: equality_comparable. David Pierre ha ragione a dire che puoi usarlo, ma anche la tua risposta è corretta, che il nuovo operatore! = Non sarà trovato da ADL, quindi avrai bisogno di un operatore che utilizza.
Lo chiederei nella mailing list di boost-users.
Modifica dal commento di @ AFoglia:
Sette mesi dopo, e sto studiando Boost.Variant, e mi imbatto in questa migliore spiegazione degli elenchi di omissioni.
http://boost.org/Archives/boost/2006/06/ 105895.php
operator==
chiama operator!=
per la classe attuale attualmente nella variante. Allo stesso modo, chiamare a!=b
dovrebbe anche chiamare !(a==b)
della classe. (Perché, in teoria, una classe può essere definita in modo che <=> non sia la stessa di <=>.) Ciò aggiungerebbe un altro requisito per cui le classi nella variante hanno un <=>. (C'è un dibattito sul fatto se puoi fare questo assunto nel thread della mailing list.)
Altri suggerimenti
Questo è un link alla risposta dell'autore stesso quando questa domanda è stata formulata su boost mailing list
Riassumendolo, secondo l'opinione dell'autore, l'implementazione di operatori di confronto (! = e <) aggiungerebbe ulteriori requisiti sui tipi usati per creare il tipo di variante.
Non sono d'accordo con il suo punto di vista, poiché! = può essere implementato allo stesso modo di ==, senza necessariamente nascondere le possibili implementazioni di questi operatori per ciascuno dei tipi che compongono la variante
Perché non è necessario.
Boost ha una libreria di operatori che definisce operatore! = in termini di operatore ==