Разумно, что sizeof
и typeid
не могут быть перегружены, но я не вижу вреда при перегрузке ?:
, .*
и .
. Существуют ли технические причины для этого?
Почему все не может быть перегружено на С++?
Ответ 1
Процитировать Bjarne Stroustrup:
Нет основополагающих причин для запретить перегрузку?:. я просто не видит необходимости вводить специальный случай перегрузки тройной оператор. Заметим, что функция перегрузка expr1? expr2: expr3 не сможет гарантировать, что только один expr2 и expr3.
...
Оператор. (точка) может в принципе быть перегруженный с использованием той же используется для → . Однако это может приводят к операция предназначена для объекта перегрузка
.
или объект, упомянутый.
... Эта проблема может быть решена в несколько путей. В момент стандартизации, это не было очевидно каким образом было бы лучше.
Ответ 2
Если вы перегрузите .
, как бы вы получили доступ к членам класса? В чем смысл obj.data
?
Ответ 3
Каким будет синтаксис?
На самом деле есть веские причины не перегружать любого оператора который не оценивает все его операнды: вы не должны перегрузка && или || либо (за исключением особых случаев). Вы не можете имитировать это с помощью перегруженного оператора. Рассмотрим что-то как: p!= NULL? defaultValue: p- > getValue() где тип defaultValue или p- > getValue() вызывает перегрузку чтобы получить перегрузку. Это обычная идиома, но его нельзя заставить работать, если вы перегружены?:.
Ответ 4
Здесь некоторый материал для чтения С++ FAQ Lite:)
В общем случае не будет пользы для перегрузки вышеперечисленных операторов. Какую дополнительную семантику вы пытаетесь реализовать?
Причиной перегрузки операторов является предоставление интуитивно понятного синтаксиса пользователю вашего класса. Например, имеет смысл перегрузить + и + = для строк. Для другого разработчика очевидно, что это значит.
На самом деле неясно, что вы перегрузите?: для... Тем не менее, нет никаких технических причин, о которых я знаю, что это не позволяло этим операторам перегружаться.
Перегрузка оператора → позволяет создавать ссылочные подсчитанные указатели, такие как boost:: shared_ptr. Концепция "отрицания" объекта может иметь разные значения в разных контекстах, поэтому разумно иногда перегружать этот оператор.
Ответ 5
Определить "operator bool" достаточно для?: работать. Для оператора. подумайте об этом: SomeClass. "SomeString!!"
Эти перегрузки запрещают компилятору lexer корректно обрабатывать файл.
Ответ 6
Причина, по которой вы можете перегрузить большинство операторов, - это возможность моделирования встроенных типов. Поскольку ни один из встроенных типов не может использовать оператор .
, он не будет служить никакой цели. operator*
и operator->
, поэтому вы можете создавать свои собственные классы указателей. Все математические и логические операторы могут создавать собственные числовые классы.