Перегрузка оператора postfix ++ - PullRequest
3 голосов
/ 11 марта 2011

Является ли какое-то принудительное правило, что функция overload ++ должна принимать int в качестве аргумента, чтобы отличаться от префиксных операторов?

Кроме того, в случае использования префикса overload ++, как правый операнд является неявным аргументом?

Например, ++ClassObj //ClassObj is rhs, but usualy lhs is made implicit

Ответы [ 3 ]

6 голосов
/ 11 марта 2011

По второму вопросу. И префикс, и постфикс ++ являются унарными операторами, у них нет левой стороны и правой стороны операнда, но есть один операнд, к которому они применяются. То есть в x++ и ++x, x - это операнд , не правая / левая рука, а операнд .

Тогда о том, почему int, который требуется в сигнатуре постфиксной версии, требуется искусственный целочисленный аргумент (который не используется) только для того, чтобы дифференцировать сигнатуры и позволить компилятору узнать что вы объявляете / определяете постфикс ++, а не префикс его версию. Считайте это тегом больше всего на свете, поскольку язык требует разных подписей.

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

C ++ должен иметь значение в сигнатуре функции.К сожалению, x++ и ++x имеют только один реальный аргумент, а именно x.Таким образом, дизайнеры C ++ выбрали своего рода hack, чтобы определить фиктивный неиспользуемый параметр int.Это приводит к разным сигнатурам методов и, таким образом, позволяет компилятору C ++ отличать префикс от оператора постфикса.

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

Да .. Это определено в стандарте.

Из стандартных документов 13.5.7 Увеличение и уменьшение ,

Пользовательская функция под названием operator ++ реализует оператор префикса и постфикса ++. Если эта функция является членом функция без параметров или функция, не являющаяся членом, с одним параметром класса или типа перечисления, она определяет префиксный оператор приращения ++ для объектов этого типа. Если функция является функцией-членом с одним параметром (который должен иметь тип int) или функцию, не являющуюся членом, с двумя параметрами (второй из которых должен иметь тип int), определяет оператор приращения постфикса ++ для объектов этого типа. Когда приращение постфикса вызывается в результате используя оператор ++, аргумент int будет иметь значение ноль.

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