Сравнение (& lt;), выходные данные (& lt; & lt;) и присвоение (=) для boost :: option

У меня есть несколько вопросов о том, как boost::optional работает. Давайте сначала сделаем это:

boost::optional<int> i;
  1. Является i < 3 всегда эквивалентно *i < 3 (и аналогично для других операторов отношений)?
  2. Верно ли, что условия i < 3 а также *i < 3 не определены? (i до сих пор не установлено ничего)
  3. Что такое std::cout << i должен печатать?
  4. Я уверен, что i = 3 всегда так же, как *i = 3, Если это так, что я должен предпочесть?

5

Решение

  1. Если i неинициализирован, первый вернет true, а второй подтвердит.
  2. Нет. Документация для operator< ясно указывает, что если левый аргумент не инициализирован, он вернется true когда правый операнд установлен.
  3. Здесь нет operator<< за optional поэтому я предполагаю, что он вернет unspecified-bool-type преобразование и печать 1 или 0 (истина / ложь).
  4. Они не одинаковы. Если i не инициализируется, последний будет утверждать, тогда как первый будет инициализировать и назначать. Вы должны использовать тот, который указывает семантику, которую вы желаете.
9

Другие решения

Что касается пункта 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'

Это дополнительное пространство в первом случае вызвало у меня некоторое замешательство.

4

По вопросам рекламы [email protected]