постфиксный оператор постфикс - PullRequest
1 голос
/ 29 ноября 2010

Стандарт C ++ определяет выражение с использованием индексов в качестве выражения постфикса. AFAIK, этот оператор всегда принимает два аргумента (первый - указатель на T, а другой - enum или целочисленный тип). Следовательно, он должен квалифицироваться как бинарный оператор.

Однако MSDN и IBM не отображает его как бинарный оператор.

Итак, вопрос в том, что такое оператор индекса? Это одинарный или бинарный? Конечно, это не является одинарным, поскольку не упоминается в $ 5.3 (по крайней мере, прямо).

Что это означает, когда Стандарт упоминает о его использовании в контексте выражения постфикса?

Ответы [ 4 ]

1 голос
/ 29 ноября 2010

Я думаю, что в этом контексте используется контекст []. В разделе 5.2.1 символ [] используется в контексте постфиксного выражения, которое «идентично (по определению) * ((E1) + (E2))». В этом контексте [] не является оператором. В разделе 13.5.5 используется для обозначения оператора подписки. В этом случае это оператор, который принимает один аргумент. Например, если я написал:

 x = a[2];

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

x = *(a + 2);

потому что «а» может быть объектом. Если a является типом объекта, то в этом контексте [] используется как оператор индекса.

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

1 голос
/ 29 ноября 2010

Вы правы, что operator[] - бинарный оператор, но он особенный в том, что он также должен быть функцией-членом.

Аналогично operator()

Вы можете прочитать о постфиксных выражениях здесь

Я только что нашел интересную статью о operator[] и выражении постфикса, здесь

1 голос
/ 29 ноября 2010

Я бы хотел согласиться с вами в том, что operator[] - это двоичный оператор в самом строгом смысле, поскольку он принимает два аргумента: (возможно, неявная) ссылка на объект и значение некоторого другого типа ( не обязательно перечисляемый или цельный). Однако, поскольку это оператор брекетинга, вы можете сказать, что последовательность токенов [x], где x может быть любым допустимым выражением индекса, квалифицируется как унарный оператор постфикса в абстрактном смысле; думаю, карри.

Кроме того, вы не можете, например, перегрузить глобальный operator[](const C&, size_t). Компилятор жалуется, что operator[] должна быть нестатической функцией-членом.

0 голосов
/ 29 ноября 2010

Если вы внимательно посмотрите на http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B, это объяснит вам, что, как вы сказали, стандартный оператор C ++ распознает оператор [] как двоичный оператор.Оператор [], вообще говоря, двоичный, и, несмотря на возможность сделать его унарным, он всегда должен использоваться как двоичный внутри класса, даже если он не имеет смысла вне класса.

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

Следование инструкциям, подобным тому, которое я вам предоставил, - хороший способ сделать все правильноманера.

Итак, всегда остерегайтесь примеров, когда операторы перегружены без надлежащей практики (вне стандарта), сначала обратитесь к стандартным методам и используйте те примеры, которые им соответствуют.

...