Перегрузка логических операторов считается плохой практикой?

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

7 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам