Следующий код не сможет скомпилироваться в 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==
добавляет инструкцию и поэтому менее эффективен. Это приводит к тому, что некоторые программисты покорно выписывают свой комплекс. !=
выражение в полном объеме, и за эти годы я исправил ряд ошибок, связанных с несовпадающими операторами.
Является ли это принуждение к написанию обоих операторов случаем преждевременной / унаследованной оптимизации, или есть хорошая, солидная, практическая причина для такого удвоения кода, которого я просто как-то упускаю?
Я бы сказал, что в отсутствие каких-либо неопровержимых доказательств, наоборот, это чисто преждевременная оптимизация (даже не унаследованная — я сомневаюсь, что когда-либо были веские причины для этого, по крайней мере, во всем, что приближается к временным рамкам C ++).
Для чего это стоит, §20.2.1 стандарта C ++ определяет ряд перегрузок в <utility>
это даст вам !=
основанный на operator==
и >
, >=
, <=
все основано на operator<
,
Почему бы не использовать это:
bool f(const A& lhs, const A& rhs) { return !(lhs == rhs); }