Почему boost :: option не предоставляет оператора! =
-
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 имеет библиотеку операторов , которая определяет оператор! = в терминах оператора ==