Практическая причина определения оператора! =

Следующий код не сможет скомпилироваться в GCC, потому что он делает определять operator== но не определяет operator!=,

struct A {
unsigned int m_i;
bool operator == (const A& rhs) const { return m_i == rhs.m_i; }
};

bool f(const A& lhs, const A& rhs) { return lhs != rhs; }

Очевидно, он хочет либо

bool operator != (const A& rhs) const { return !(operator==(rhs)); }

или же

bool operator != (const A& rhs) const { return m_i != rhs.m_i; }

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

Является ли это принуждение к написанию обоих операторов случаем преждевременной / унаследованной оптимизации, или есть хорошая, солидная, практическая причина для такого удвоения кода, которого я просто как-то упускаю?

2

Решение

Я бы сказал, что в отсутствие каких-либо неопровержимых доказательств, наоборот, это чисто преждевременная оптимизация (даже не унаследованная — я сомневаюсь, что когда-либо были веские причины для этого, по крайней мере, во всем, что приближается к временным рамкам C ++).

Для чего это стоит, §20.2.1 стандарта C ++ определяет ряд перегрузок в <utility> это даст вам != основанный на operator== и >, >=, <= все основано на operator<,

0

Другие решения

Почему бы не использовать это:

bool f(const A& lhs, const A& rhs) { return !(lhs == rhs); }
-1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector