Оператор ==, параметры которого являются неконстантными ссылками - PullRequest
2 голосов
/ 19 декабря 2008

Я этот пост , я видел это:

class MonitorObjectString: public MonitorObject {
    // some other declarations
    friend inline bool operator==(/*const*/ MonitorObjectString& lhs,
                                  /*const*/ MonitorObjectString& rhs)
    { return lhs.fVal==rhs.fVal; }
}

Прежде чем мы продолжим, ЭТО ОЧЕНЬ ВАЖНО:

  • Я не подвергаю сомнению способность кого-либо кодировать.
  • Мне просто интересно , почему кому-то понадобятся неконстантные ссылки в сравнении.
  • Афиша этого вопроса не не написала этот код.

Это было на всякий случай. Это тоже важно:

  • Я добавил /*const*/ s и переформатировал код.

Теперь вернемся к теме:

Я не могу думать о разумном использовании оператора равенства, который позволяет вам изменять его аргументы by-ref. Вы?

Ответы [ 5 ]

5 голосов
/ 19 декабря 2008

Возможно, классы используют форму отложенной инициализации. Когда к данным обращаются, должна произойти надлежащая инициализация, и данные должны быть выбраны. Это может изменить членов класса.

Однако, ленивая инициализация может быть сформирована так, чтобы модификация к классу не требовалась. Это может быть достигнуто с помощью идиомы Pimpl (указателем на закрытый класс) или с помощью ключевого слова mutable (не рекомендуется!).

5 голосов
/ 19 декабря 2008

Скорее всего они забыли const. Операторские перегрузки должны вести себя согласованно и не выполнять действия «вне характера».

Как правило, оператор равенства никогда не должен изменять ни один из сравниваемых объектов. Объявление const обеспечивает это на уровне компилятора. Тем не менее, это часто не учитывается. «Const правильность» очень часто упускается из виду в C ++.

2 голосов
/ 19 декабря 2008

Существует проблема, которая ставит вас в тупик.

Если у меня есть два MonitorObjectString, которые уже являются постоянными, я не могу использовать эту функцию равенства.

1 голос
/ 19 декабря 2008

Если вы не можете использовать const, потому что изменяете операнды, вы неправильно используете перегрузку операторов.

Если вы не можете использовать const, потому что реализация вызывает неконстантные функции, вам действительно следует их очистить или, по крайней мере, предоставить альтернативы const.

Если вы вызываете код, который вы не можете изменить, который не использует const, я все равно использовал бы const, использовал const_cast в самой глубокой доступной точке и прокомментировал его.

Как указал Шмоопти, оператор гораздо менее полезен, чем он должен быть, поскольку его нельзя использовать на объектах const, даже если только один из них является const. Оператор числового равенства, который не поддерживает «a == 5», серьезно нарушил бы закон наименьшего удивления.

1 голос
/ 19 декабря 2008

В этом случае явно нет требования к неконстантным аргументам, и, как и вы, я бы не подумал, что для этого есть и общий случай.

Однако, безусловно, проблемы с константной корректностью могут вытолкнуть их вверх из нижних уровней кода, и если вы не можете исправить их низкоуровнево, вам, возможно, придется обходить их выше. Возможно, это то, что здесь произошло в какой-то момент?

...