Определение равенства


При перегрузке оператора "= = "в c++ существует ли стандартное определение того, что явно означает равенство, или набор руководящих принципов, как должно вести себя"=="?

В настоящее время у меня есть класс, который не хранит все свое " я " в памяти. Он в основном использует очередь приоритетов, чтобы определить, как часто используется объект внутри себя, и когда объекты выскакивают из конца очереди, они удаляются из памяти и записываются на диск.

Итак, теперь проблема возникает с равенство, что это значит для двух из этих объектов, чтобы быть равными. Поскольку мы могли бы начать с объектов A и B, которые одинаковы во всех отношениях, они загрузили одни и те же данные в память и имеют одни и те же данные на диске. Но тогда после вызова ряда функций на A и B они могли бы теперь отличаться. A и B по-прежнему имеют одни и те же данные на диске, но они имеют разные данные, загруженные в память. Итак, вопрос в том, должен ли A == B разрешиться в true или false?

Существует ли набор правил или руководящие принципы, которые определяют, как это должно работать? Или это просто ситуация, когда я решаю, что имеет наибольший смысл для программы и документирую, что делает"=="?

3 5

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.", но это действительно должно быть исключением.

Точно так же, если оператор не имеет полного смысла, не заставляйте его делать что - то "удивительное" (например, - для строк-что он делает? Или умножить одну строку на другую строку-умножение на целое число может иметь значение). Сюрпризы в программировании-плохая идея. Если все пойдет не так, как ты Ожидайте, что вы получите плохие впечатления от чтения / изменения кода.