Подтвердить что ты не робот

Почему все не может быть перегружено на С++?

Разумно, что sizeof и typeid не могут быть перегружены, но я не вижу вреда при перегрузке ?:, .* и .. Существуют ли технические причины для этого?

4b9b3361

Ответ 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->, поэтому вы можете создавать свои собственные классы указателей. Все математические и логические операторы могут создавать собственные числовые классы.