Для двух идентичных экземпляров boost::variant
a
и b
разрешено выражение ( a == b )
.
Однако ( a != b )
кажется undefined. Почему это?
Для двух идентичных экземпляров boost::variant
a
и b
разрешено выражение ( a == b )
.
Однако ( a != b )
кажется undefined. Почему это?
Я думаю, что это просто не добавлено в библиотеку. 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!=
. (Существует дискуссия о том, можете ли вы сделать это предположение в потоке списка рассылки.)
Потому что это не нужно.
Boost имеет библиотеку операторов которая определяет оператор!= в терминах оператора ==
Это ссылка на ответ самого автора, когда этот вопрос был сформулирован в расширенном списке рассылки
Подводя итог этому, по мнению автора, реализация операторов сравнения (!= и <) добавит больше требований к типам, используемым для создания типа варианта.
Я не согласен с его точкой зрения, хотя, поскольку!= можно реализовать так же, как ==, не обязательно скрывая возможные реализации этих операторов для каждого из типов, составляющих вариант