Classes and class hierarchies
C.86
Сделайте `==` симметричным относительно типов операндов и `noexcept`
Причина
Асимметричная обработка операндов удивительна и является источником ошибок, когда возможны преобразования. == — фундаментальная операция, и программисты должны иметь возможность использовать её без страха перед отказом.
Пример
struct X {
string name;
int number;
};
bool operator==(const X& a, const X& b) noexcept {
return a.name == b.name && a.number == b.number;
}
Пример, плохой
class B {
string name;
int number;
bool operator==(const B& a) const {
return name == a.name && number == a.number;
}
// ...
};
Сравнение B принимает преобразования для своего второго операнда, но не для первого.
Примечание
Если класс имеет состояние отказа, подобное NaN у double, существует искушение сделать сравнение с состоянием отказа выбросом исключения. Альтернатива — сделать два состояния отказа равными и любое состояние истинности — ложным при сравнении с состоянием отказа.
Примечание
Это правило применяется ко всем обычным операторам сравнения: !=, <, <=, > и >=.
Применение
- Отмечайте
operator==(), для которого типы аргументов отличаются; то же для других операторов сравнения:!=,<,<=,>и>=. - Отмечайте члены
operator==(); то же для других операторов сравнения:!=,<,<=,>и>=.