2013-06-29 3 views
5

Ho alcune domande su come funziona boost::optional. Cerchiamo di fare questo prima:Confronto (<), uscita (<<) e assegnazione (=) per boost :: opzionale

boost::optional<int> i; 
  1. È i < 3 sempre equivalente a *i < 3 (e simili per gli altri operatori relazionali)?
  2. E 'corretto che le condizioni i < 3 e *i < 3 non siano definite? (i non è ancora stato impostato su alcun valore)
  3. Cosa deve stampare std::cout << i?
  4. Sono abbastanza sicuro che lo i = 3 sia sempre lo stesso di *i = 3. Se sì, quale preferirei?
+1

'i.get()' è il tuo fratello. –

+1

ha fatto decollare la sua documentazione nelle ultime versioni? –

risposta

9
  1. No. Se i è inizializzato, il primo restituirà true mentre il secondo asserirà.
  2. No. La documentazione per operator< indica chiaramente che se l'argomento di sinistra non è inizializzato, restituirà true quando viene impostato l'operando di destra.
  3. Non c'è operator<< per optional quindi presumo che restituirà la conversione unspecified-bool-type e stampa 1 o 0 (vero/falso).
  4. Non sono la stessa cosa. Se i non è inizializzato, quest'ultimo si asserirà mentre il primo verrà inizializzato e assegnato. Dovresti usare quello che indica la semantica che desideri.
4

quanto riguarda il punto 3, non v'è un operatore < < per boost :: opzionale dichiarata in boost/facoltativa/optional_io.hpp, ma probabilmente non stanno includendo quello. (Se ti capita di usare boost property_tree, viene comunque incluso per te.) Se è incluso, un opzionale vuoto scorrerà come "-" e un facoltativo popolato invierà un carattere di spazio extra e quindi invierà il flusso del valore.

Quindi questo codice:

#include <boost/optional/optional_io.hpp> 
boost::optional<string> var1 = "value"; 
boost::optional<string> var2; 
cout << " var1 = '" << var1 << "'\n"; 
cout << "*var1 = '" << *var1 << "'\n"; 
cout << " var2 = '" << var2 << "'\n"; 

cede questo:

var1 = ' value' 
*var1 = 'value' 
var2 = '--' 

ma lo stesso codice senza i rendimenti includono questo, come suggerisce la risposta di Mark B:

var1 = '1' 
*var1 = 'value' 
var2 = '0' 

Quello lo spazio extra nel primo caso mi ha causato un po 'di confusione.