У меня есть несколько вопросов о том, как boost::optional
работает. Давайте сначала сделаем это:
boost::optional<int> i;
i < 3
всегда эквивалентно *i < 3
(и аналогично для других операторов отношений)?i < 3
а также *i < 3
не определены? (i
до сих пор не установлено ничего)std::cout << i
должен печатать?i = 3
всегда так же, как *i = 3
, Если это так, что я должен предпочесть?i
неинициализирован, первый вернет true, а второй подтвердит.operator<
ясно указывает, что если левый аргумент не инициализирован, он вернется true
когда правый операнд установлен.operator<<
за optional
поэтому я предполагаю, что он вернет unspecified-bool-type
преобразование и печать 1 или 0 (истина / ложь).i
не инициализируется, последний будет утверждать, тогда как первый будет инициализировать и назначать. Вы должны использовать тот, который указывает семантику, которую вы желаете.Что касается пункта 3, там является оператор<< для Boost :: Option объявлен в Boost / Optional / Optional_io.hpp, но вы, вероятно, не включая это. (Если вам случится использовать boost property_tree, то он будет включен для вас.) Если он включен, пустой необязательный параметр будет отображаться как «-», а заполненный необязательный параметр будет выводить дополнительный пробел, а затем выводить значение.
Итак, этот код:
#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";
дает это:
var1 = ' value'
*var1 = 'value'
var2 = '--'
но тот же код без включения дает это, как предполагает ответ Марка Б.
var1 = '1'
*var1 = 'value'
var2 = '0'
Это дополнительное пространство в первом случае вызвало у меня некоторое замешательство.