2013-06-29 15 views
5

Mam kilka pytań dotyczących działania boost::optional. Niech najpierw to zrobić:Porównanie (<), wyjście (<<) i przypisanie (=) w celu zwiększenia :: opcjonalnie

boost::optional<int> i; 
  1. Czy i < 3 zawsze równoważne *i < 3 (i podobny do innych operatorów relacyjnych)?
  2. Czy to prawda, że ​​warunki i < 3 i *i < 3 są niezdefiniowane? (i nie zostało jeszcze ustawione)
  3. Co to jest std::cout << i, co ma być drukowane?
  4. Jestem prawie pewien, że i = 3 jest zawsze taki sam jak *i = 3. Jeśli tak, to co powinienem wybrać?
+1

'i.get()' jest twoim bratem. –

+1

czy doładowanie zmniejszyło dokumentację w późnych wersjach? –

Odpowiedz

9
  1. nr Jeśli i jest niezainicjowanego pierwszy powróci prawdziwa, a drugi będzie dochodzić.
  2. Nie. Dokumentacja dla operator< wyraźnie wskazuje, że jeśli lewy argument nie zostanie zainicjalizowany, zwróci true po ustawieniu prawego operandu.
  3. Nie ma operator<< dla , więc zakładam, że zwróci konwersję unspecified-bool-type i wydrukuje 1 lub 0 (prawda/fałsz).
  4. To nie to samo. Jeśli i nie zostanie zainicjowany, ten ostatni będzie twierdził, podczas gdy pierwszy będzie inicjował i przypisał. Powinieneś użyć tego, który wskazuje na semantykę, której pragniesz.
4

Odnośnie pkt 3, nie jest operator < < dla boost :: opcjonalny zadeklarowanej doładowania/opcjonalnie/optional_io.hpp, ale prawdopodobnie nie są w tym. (Jeśli jednak użyjesz boost property_tree, zostanie on włączony do ciebie). Jeśli zostanie uwzględniony, pusty opcjonalny będzie streamowany jako "-", a wypełniony opcjonalnie wypuści dodatkowy znak spacji, a następnie wyświetli wartość strumienia.

Więc ten kod:

#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"; 

daje to:

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

ale ten sam kod bez rentowności włączenia tego, jak sugeruje znak B za odpowiedź:

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

Że dodatkowa przestrzeń w pierwszym przypadku spowodowała pewne zamieszanie.