Типнеобязательно<T>
является.Равенство
Всякий раз, когдаT
Равенство
. Два необязательных объекта, содержащих значение, сравниваются так же, как и содержащиеся в них значения. Неинициализированное состояниефакультативно<T>
рассматривается как отдельное значение, равное самому себе и неравное любому значению типа.T
:
boost::optional<int> oN = boost::none;
boost::optional<int> o0 = 0;
boost::optional<int> o1 = 1;
assert(oN != o0);
assert(o1 != oN);
assert(o0 != o1);
assert(oN == oN);
assert(o0 == o0);
Конструктор преобразования изT
, а также изповышения::ни один
не подразумевает существования и семантики смешанного сравнения междуT
ифакультативным<T>
, а также междуno_t
иопциональным<T
:
assert(oN != 0);
assert(o1 != boost::none);
assert(o0 != 1);
assert(oN == boost::none);
assert(o0 == 0);
Это смешанное сравнение имеет практическое толкование, которое иногда полезно:
boost::optional<int> choice = ask_user();
if (choice == 2)
start_procedure_2();
В приведенном выше примере значение сравнения — «выбранное пользователем число 2». Если пользователь ничего не выбирал, он не выбирал номер 2.
В случае, еслифакультативный<T>
сравнивается сни с одним
, не требуется, чтобыT
былСравнимое равенство
.
Аналогичным образом, типнеобязательный<T>
являетсяLessThanComparable
всякий раз, когдаT
являетсяLessThanComparable
. Факультативный объект, не содержащий значения, сравнивается с любым значениемT
. Чтобы проиллюстрировать это, если по умолчанию упорядочиваниеsize_t
является {0
,1
,2
, ...}, по умолчанию упорядочиваниенеобязательно<size_t>
является {повышением,0
,1
,2
, ...}. Этот порядок не имеет практического толкования. Цель состоит в том, чтобы иметь любой семантически правильный порядок по умолчанию для того, чтобыфакультативный<T>
мог использоваться в упорядоченных ассоциативных контейнерах (где быT
не использовался).
Смешанные реляционные операторы являются единственным случаем, когда содержащееся значение необязательного объекта может быть проверено без использования функции доступа к значениюоператор*
,значение
,значение_или
.