Почему все не может быть перегружено в C ++? - PullRequest
13 голосов
/ 15 марта 2011

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

Ответы [ 6 ]

16 голосов
/ 15 марта 2011

Цитировать Бьярн Страуструп:

Нет фундаментальной причины запретить перегрузку? я просто не видел необходимости вводить особый случай перегрузки тройной оператор. Обратите внимание, что функция перегрузка expr1? expr2: expr3 будет не сможет гарантировать, что только один из expr2 и expr3 был выполнен.

...

Оператор. (точка) может быть в принципе перегружен, используя ту же технику, что и используется для ->. Тем не менее, это может привести к вопросам о том, является ли операция предназначена для объекта перегрузка . или указанный объект . ... Эта проблема может быть решена в несколько путей. На момент стандартизация, это не было очевидно какой путь будет лучшим.

Источник

7 голосов
/ 15 марта 2011

Если вы перегрузите ., как бы вы получили доступ к ученикам? Что бы означало obj.data?

3 голосов
/ 15 марта 2011

Какой будет синтаксис?

На самом деле, есть веские причины не перегружать ни одного оператора. который не оценивает все свои операнды: вы не должны перегрузка && или || либо (кроме особых случаев). Ты не можешь смоделируйте это с перегруженным оператором. Рассмотреть что-то лайк: p! = NULL? defaultValue: p-> getValue () где тип defaultValue или p-> getValue () вызывает перегрузку разрешение забрать вашу перегрузку. Это обычная идиома, но это не может быть сделано, если вы перегружены?:.

0 голосов
/ 15 марта 2011

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

0 голосов
/ 15 марта 2011

Определение «оператор bool» достаточно для?: Работать. Для оператора. подумайте об этом: SomeClass. "SomeString !!"

Эти перегрузки запрещают лексеру компилятора правильно анализировать файл.

0 голосов
/ 15 марта 2011

Вот некоторые материалы для чтения C ++ FAQ Lite :)

В общем случае перегрузка вышеуказанных операторов не принесет никакой пользы.Какую дополнительную семантику вы пытаетесь реализовать?

Причина перегрузки операторов заключается в предоставлении интуитивно понятного синтаксиса пользователю вашего класса.Например, имеет смысл перегружать + и + = для строк.Для другого разработчика очевидно, что это означает.

Неужели не очевидно, что бы вы перегрузили ?: для ... При этом нет никаких технических причин, которые, как мне известно, препятствовали перегрузке этих операторов.

Перегрузка оператора -> позволяет создавать указатели с подсчетом ссылок, такие как boost :: shared_ptr.Понятие «отрицание» объекта может иметь разные значения в разных контекстах, поэтому разумно иногда перегружать этот оператор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...