В большинстве случаев семантика a!=b
должна быть равна !(a==b)
.
То же самое относится ко всем остальным операторам: a<b
должно быть равно !(a=>b)
и !(a==b || a>b)
, a<=b && !(a==b)
и т. Д. И т. П.
Для этой цели boost.operators предлагает несколько потрясающих инструментов для автоматического генерирования операторов в зависимости от других.
Однако, когда вы даете определенную семантику своим операторам (то есть: вы не используете ==
, чтобы проверить, являются ли два элемента одинаковыми, но чтобы сделать некоторые причудливые вещи, как STL делает с >>
и <<
) вы можете захотеть дать им разные реализации.
Эта практика, как правило, не рекомендуется, хотя даже STL и многие библиотеки boost делают это.
РЕДАКТИРОВАТЬ - Небольшое дополнение:
То, что я сказал до сих пор, касается только семантики операторов. Если вы решите, что семантика вашего a!=b
должна быть !(a==b)
, у вас есть два способа реализовать это:
путем вызова другого оператора, что происходит, если вы используете boost.operators:
bool operator!=(a,b) { return !(a==b); }
реализация их обоих с нуля.
Первый метод обычно проще в реализации и безопаснее. Наиболее распространенная вещь, которая может оправдать второй вариант, - это оптимизация, хотя, вероятно, она того не стоит: современные компиляторы в большинстве случаев не добавляют никаких издержек (если вы посмотрите на исходный код boost.operators, вы увидите много комментариев о том, как они положитесь на NRVO , чтобы не добавлять накладных расходов, или как их код изменяется, если компилятор не предоставляет NRVO).
Какой бы вариант вы ни выбрали, в любом случае это не должно иметь никакого значения для логики вашего приложения, поскольку важна семантика (то есть, как ведут себя ваши операторы, что они возвращают для любого возможного ввода).