subscript operator postfix

纵饮孤独 提交于 2019-12-11 09:27:23

问题


The C++ standard defines the expression using subscripts as a postfix expression. AFAIK, this operator always takes two arguments (the first is the pointer to T and the other is the enum or integral type). Hence it should qualify as a binary operator.

However MSDN and IBM does not list it as a binary operator.

So the question is, what is subscript operator? Is it unary or binary? For sure, it is not unary as it is not mentioned in $5.3 (at least straigt away).

What does it mean when the Standard mentions it's usage in the context of postfix expression?


回答1:


I'd tend to agree with you in that operator[] is a binary operator in the strictest sense, since it does take two arguments: a (possibly implicit) reference to an object, and a value of some other type (not necessarily enumerated or integral). However, since it is a bracketing operator, you might say that the sequence of tokens [x], where x might be any valid subscript-expression, qualifies as a postfix unary operator in an abstract sense; think currying.

Also, you cannot overload a global operator[](const C&, size_t), for example. The compiler complains that operator[] must be a nonstatic member function.




回答2:


You are correct that operator[] is a binary operator but it is special in that it must also be a member function.

Similar to operator()

You can read up on postfix expressions here

I just found an interesting article about operator[] and postfix expression, here




回答3:


I think it's the context that [] is used in that counts. Section 5.2.1 the symbol [] is used in the context of a postfix expression that is 'is identical (by definition) to *((E1)+(E2))'. In this context, [] isn't an operator. In section 13.5.5 its used to mean the subscripting operator. In this case it's an operator that takes one argument. For example, if I wrote:

 x = a[2];

It's not necessarily the case that the above statement evaluates to:

x = *(a + 2);

because 'a' might be an object. If a is an object type then in this context, [] is used as an subscript operator.

Anyway that's the best explanation I can derive from the standard that resolves apparent contradictions.




回答4:


If you take a close look to http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B it will explain you that standard C++ recognize operator[] to be a binary operator, as you said. Operator[] is, generally speaking, binary, and, despite there is the possibility to make it unary, it should always be used as binary inside a class, even because it has no sense outside a class.

It is well explained in the link I provided you... Notice that sometimes many programmers overload operators without think too much about what they are doing, sometimes overloading them in an incorrect manner; the compiler is ease is this and accept it, but, probably, it was not the correct way to overload that operator.

Following guides like the one I provided you, is a good way to do things in the correct manner.

So, always beware examples where operators are overloaded without a good practice (out of standard), refer, first to the standard methods, and use those examples that are compliant to them.



来源:https://stackoverflow.com/questions/4302142/subscript-operator-postfix

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!