2009-06-25 2 views
15

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

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

+0

(! (A == b)) == (a! = B) – dragonfly

+0

В моем смысле это потому, что '==' необходим для 'map' contenance (а также' hash_value'), но оператор! = Это роскошь :) –

ответ

11

Я думаю, что это просто не добавил в библиотеку. 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!=. (Существуют дебаты, можно ли сделать это предположение в списке рассылки нити.)

+4

Семь месяцев спустя, и я изучаю Boost.Variant, и я наткнулся на это лучшее объяснение упущения http://lists.boost.org/Archives/boost/2006/06/105895.php. Оператор == вызывает operator == для фактического класса в данный момент в варианте. Аналогично вызывающий оператор! = Должен также вызывать оператор! = Класса. (Потому что, теоретически, класс может быть определен так, что a! = B не то же самое, как! (A == b).) Таким образом, это добавит еще одно требование, чтобы классы в варианте имели оператор! =. (Существует дискуссия о том, можете ли вы сделать это предположение в потоке списка рассылки). – AFoglia

2

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

подталкивания имеет operators library, который определяет оператор! = В срок оператора ==

+2

Я мог ошибаться. Но если вариант использует библиотеку операторов, не означает ли это, что a! = B * должен * работать? Я думаю, что он хочет использовать std :: rel_ops вместо: {using std :: rel_ops :: operator! =; getA()! = getB(); } –

+0

Я не хотел сказать, что вариант использует сам lib, но вы можете сделать это сами, чтобы ввести оператор! = –

+0

Итак, ожидание состоит в том, чтобы включить дополнительный заголовок и добавить объявление использования в исходные файлы, где: = желательно? –

2

Это a link to the answer from the author himself, когда этот вопрос был сформулирован в списке подталкивания рассылки

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

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

Смежные вопросы