Перегрузка логических операторов считается плохой практикой? - PullRequest
11 голосов
/ 27 февраля 2011

Это плохая идея перегружать &&, || или оператор запятой и почему?

Ответы [ 7 ]

13 голосов
/ 27 февраля 2011

Я бы не перегружал operator&& или operator||.Даже если вы определили класс, который порождает булеву алгебру (например, конечные множества), возможно, будет лучшим выбором перегружать operator& и operator|.

. Причина в том, что программисты на C ++ожидать особой семантики для operator&& и operator||: они с коротким замыканием , т.е. не оценивать их правый аргумент, если в этом нет необходимости.Вы не можете получить это поведение при перегрузке, так как вы будете определять функцию.

Перегрузка operator, была сделана, например, в библиотеке Boost.Assign .Это также единственный пример его перегрузки, который я знаю, и я никогда даже не думал о его перегрузке.Вам лучше иметь очень конкретный вариант использования, когда другой оператор не подходит.

4 голосов
/ 27 февраля 2011

Для перегрузки логических операторов в C ++ операнды должны быть оценены, что обычно не работает при коротком замыкании встроенных типов.

Посмотрите на ссылку ниже.

3 голосов
/ 27 февраля 2011

Вы не должны перегружать какие-либо операторы, что удивительно.:-)

Если вы можете сделать это способом, который имеет смысл (не только для вас), то это хорошо.

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

3 голосов
/ 27 февраля 2011

Обычно это плохая идея: эти три оператора имеют эффект секвенирования, который теряется при их перегрузке. Потеря этого эффекта секвенирования может вызвать руку (то есть странные ошибки) тем, кто не ожидает, что потерял.

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

У перегрузок operator,, о которых я знаю, есть еще одна проблема: они работают таким образом, что кажущиеся цепочки операций не являются реальными. Обычно они используются в контексте, когда это не имеет значения, но однажды в голубой луне, это еще один источник странных ошибок.

2 голосов
/ 27 февраля 2011

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

Однако есть одна очень веская причина для их перегрузки: Шаблоны выражений . Библиотека Boost.Lambda делает это, и это очень полезно!

2 голосов
/ 27 февраля 2011

Я бы сказал, что это зависит от того, что делают ваши перегрузки. Например, && и || ожидается, что они будут работать как логические условия, поэтому, если ваша семантика перегрузки работает по-другому, они могут запутать других людей (или даже вас самих, если вы не используете их некоторое время и забываете, что они делают). Подумайте, что вы ожидаете от операторов, если не знаете, как они перегружены, и если будет проще использовать вместо них обычные методы.

0 голосов
/ 27 февраля 2011

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

...