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

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

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

Ответы

Ответ 1

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

Я бы спросил об этом в списке рассылки для ускорителей.

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

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

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

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

Ответ 3

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

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

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