Почему boost :: option не предоставляет оператора! =

StackOverflow https://stackoverflow.com/questions/1044448

  •  20-08-2019
  •  | 
  •  

Вопрос

Учитывая два одинаковых boost::variant экземпляра a и b , выражение ( a == b ) разрешено.

Однако ( a != b ) кажется неопределенным. Почему это?

Это было полезно?

Решение

Я думаю, что это просто не добавлено в библиотеку. Boost.Operators на самом деле не помогут, потому что любой из вариантов был бы получен из boost :: operator :: равенства_компарабле. Дэвид Пьер прав, говоря, что вы можете использовать это, но ваш ответ также верен, что новый оператор! = Не будет найден ADL, поэтому вам понадобится оператор использования.

Я бы спросил об этом в списке рассылки буст-пользователей.

Изменить из комментария @ AFoglia:

Семь месяцев спустя, и я изучаю Boost.Variant, и я наткнулся на это лучшее объяснение списков пропусков.

http://boost.org/Archives/boost/2006/06/ 105895.php

operator== вызывает operator!= для фактического класса, в настоящее время находящегося в варианте. Аналогично, вызов a!=b должен также вызывать !(a==b) класса. (Поскольку теоретически класс может быть определен так, что <=> не совпадает с <=>.) Таким образом, это добавит еще одно требование, чтобы классы в варианте имели <=>. (Существует дискуссия о том, можете ли вы сделать это предположение в ветке списка рассылки.)

Другие советы

Это ссылка на ответ самого автора когда этот вопрос был сформулирован в расширенной рассылке

Подводя итог, по мнению автора, реализация операторов сравнения (! = и <) добавит больше требований к типам, используемым для создания типа варианта.

Я не согласен с его точкой зрения, так как! = может быть реализован так же, как ==, без необходимости скрывать возможные реализации этих операторов для каждого из типов, составляющих вариант

Потому что это не нужно.

Boost имеет библиотеку операторов , которая определяет оператор! = в терминах оператора ==

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top