Собственно сабж. Вообще логично было бы определять логически противоположные операторы обоюдной негацией (отрицанием?):
struct Comparable {
// имеем определенный оператор ==
template <typename T>
bool operator ==(const T &rhs) const { /* ... */ }
// тогда было бы логично implicit определить
template <typename T>
bool operator !=(T&& rhs) const {
return !this->operator ==(std::forward<T>(rhs));
}
// ну или explicit
template <typename T>
bool operator !=(const T&) = default;
};
Я тут сварганил пример (естественно без шаблонов, чтоб меньше потенциальных ошибок): https://wandbox.org/permlink/a4k0hlNVI4UgyDrc
И, как можно видеть, оператор != не определяется автоматически. Вопрос: почему, ЧЯДНТ?
P.S. Нашел на stackoverflow предложение которое не вошло в С++17) но решило бы волпрос: Explicitly defaulted comparison operators