Domanda

Dato due boost::variant istanze a e b identiche, è consentita l'espressione ( a == b ) .

Tuttavia ( a != b ) sembra essere indefinito. Perché questo?

È stato utile?

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 ==

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top