Учитывая два идентичных boost::variant
экземпляров a
и b
, выражение (a == b)
допускается.Почему повышение :: вариант не обеспечивает оператор! =
Однако (a != b)
, как представляется, не определено. Почему это?
Учитывая два идентичных boost::variant
экземпляров a
и b
, выражение (a == b)
допускается.Почему повышение :: вариант не обеспечивает оператор! =
Однако (a != b)
, как представляется, не определено. Почему это?
Я думаю, что это просто не добавил в библиотеку. 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.Variant, и я наткнулся на это лучшее объяснение упущения http://lists.boost.org/Archives/boost/2006/06/105895.php. Оператор == вызывает operator == для фактического класса в данный момент в варианте. Аналогично вызывающий оператор! = Должен также вызывать оператор! = Класса. (Потому что, теоретически, класс может быть определен так, что a! = B не то же самое, как! (A == b).) Таким образом, это добавит еще одно требование, чтобы классы в варианте имели оператор! =. (Существует дискуссия о том, можете ли вы сделать это предположение в потоке списка рассылки). – AFoglia
Потому что это не нужно.
подталкивания имеет operators library, который определяет оператор! = В срок оператора ==
Я мог ошибаться. Но если вариант использует библиотеку операторов, не означает ли это, что a! = B * должен * работать? Я думаю, что он хочет использовать std :: rel_ops вместо: {using std :: rel_ops :: operator! =; getA()! = getB(); } –
Я не хотел сказать, что вариант использует сам lib, но вы можете сделать это сами, чтобы ввести оператор! = –
Итак, ожидание состоит в том, чтобы включить дополнительный заголовок и добавить объявление использования в исходные файлы, где: = желательно? –
Это a link to the answer from the author himself, когда этот вопрос был сформулирован в списке подталкивания рассылки
Обобщая его, в мнении автора, внедрение операторов сравнения (! = и <) добавили бы больше требований к типам, используемым для создания типа варианта.
Я не согласен с его точкой зрения, хотя, так! = Может быть реализован таким же образом, как ==, без необходимости сокрытия возможных реализаций этих операторов для каждого из типов, составляющие варианты
(! (A == b)) == (a! = B) – dragonfly
В моем смысле это потому, что '==' необходим для 'map' contenance (а также' hash_value'), но оператор! = Это роскошь :) –