Определение равенства
При перегрузке оператора "= = "в c++ существует ли стандартное определение того, что явно означает равенство, или набор руководящих принципов, как должно вести себя"=="?
В настоящее время у меня есть класс, который не хранит все свое " я " в памяти. Он в основном использует очередь приоритетов, чтобы определить, как часто используется объект внутри себя, и когда объекты выскакивают из конца очереди, они удаляются из памяти и записываются на диск.
Итак, теперь проблема возникает с равенство, что это значит для двух из этих объектов, чтобы быть равными. Поскольку мы могли бы начать с объектов A и B, которые одинаковы во всех отношениях, они загрузили одни и те же данные в память и имеют одни и те же данные на диске. Но тогда после вызова ряда функций на A и B они могли бы теперь отличаться. A и B по-прежнему имеют одни и те же данные на диске, но они имеют разные данные, загруженные в память. Итак, вопрос в том, должен ли A == B
разрешиться в true или false?
Существует ли набор правил или руководящие принципы, которые определяют, как это должно работать? Или это просто ситуация, когда я решаю, что имеет наибольший смысл для программы и документирую, что делает"=="?
3 ответа:
В стандарте нет определения того, как должен вести себя перегруженный
Но достаточно хорошим руководством является следующее-Если вы должны думать об этом так долго, как у вас есть, вы, вероятно, даже не должны перегружатьoperator ==
.operator ==
. Если это не интуитивно, это приносит больше вреда, чем пользы.Итак, вопрос в том, должен ли A == B разрешиться в true или false?
ИМО, это должно привести к ошибке компилятора. :)
Любая перегрузка
operator==
должна соответствовать аксиомам отношения эквивалентности , то естьМногие алгоритмы, использующие
x == x
, для всех объектовx
- если
x == y
, тоy == x
- если
x == y
иy == z
, тоx == z
.==
, полагаются на него, реализуя отношение эквивалентности, формализованное в §17.6.3.1 как понятиеEqualityComparable
.
Вся перегрузка операторов должна делать "то, что вы ожидаете". Нет смысла иметь оператор ==, который возвращает true, если объекты существенно не совпадают. То, как вы определяете "то же самое", конечно, потенциально то, о чем мы могли бы поспорить. Можно было бы реализовать "nocasestring", где он ведет себя как строка, но если у вас есть строка" HELLO "и одна" hello", они считаются равными, потому что регистр не имеет значения. Или если вы реализовали свой собственный класс" Float", где = = делает некоторую математику, чтобы избегайте хрупкого сравнения с обычной плавающей точкой. Так что да, есть случаи, когда == не делает точно "для всех элементов является a. = = b.", но это действительно должно быть исключением.
Точно так же, если оператор не имеет полного смысла, не заставляйте его делать что - то "удивительное" (например,-
для строк-что он делает? Или умножить одну строку на другую строку-умножение на целое число может иметь значение). Сюрпризы в программировании-плохая идея. Если все пойдет не так, как ты Ожидайте, что вы получите плохие впечатления от чтения / изменения кода.