C ++标准使用下标作为后缀表达式定义表达式。 AFAIK,此运算符总是带两个参数(第一个是指向T的指针,另一个是枚举或整数类型)。因此它应该有资格作为二元运算符。
所以问题是,什么是下标运算符?是一元还是二元?可以肯定的是,它不是一元的,因为在5.3美元中没有提到它(至少在straigt之外)。
当标准在后缀表达式的上下文中提到它的用法时,它是什么意思?
答案 0 :(得分:1)
我倾向于同意你的观点,operator[]
是最严格意义上的二元运算符,因为它确实需要两个参数:一个(可能是隐式的)对象的引用,以及一些其他的值类型(不一定是枚举或整数)。但是,由于它是一个包围运算符,您可能会说令牌[x]
的序列(其中x
可能是任何有效的下标表达式)在抽象意义上有资格作为后缀一元运算符;想想吧。
另外,例如,您不能重载全局operator[](const C&, size_t)
。编译器抱怨operator[]
必须是非静态成员函数。
答案 1 :(得分:1)
你是正确的operator[]
是一个二元运算符,但它的特殊之处在于它也必须是一个成员函数。
与operator()
类似
您可以阅读后缀表达式here
我刚刚发现了一篇关于operator[]
和后缀表达式here
答案 2 :(得分:1)
我认为这是使用[]的上下文。 5.2.1节符号[]用于后缀表达式的上下文中,该表达式'与(*(E1)+(E2))'相同(根据定义)。在这种情况下,[]不是运营商。在第13.5.5节中,它用于表示下标运算符。在这种情况下,它是一个接受一个参数的运算符。例如,如果我写了:
x = a[2];
上述陈述的评估结果不一定是:
x = *(a + 2);
因为'a'可能是一个对象。如果a是对象类型,则在此上下文中,[]用作下标运算符。
无论如何,这是我能从解决明显矛盾的标准中得出的最佳解释。
答案 3 :(得分:0)
如果仔细查看http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B,它会向您解释标准C ++将operator []识别为二元运算符,正如您所说。 运算符[]一般来说是二进制的,尽管有可能使它成为一元,但它应该总是在类中用作二进制,即使它在类之外没有任何意义。
我在为您提供的链接中对此进行了详细解释... 请注意,有时许多程序员会重载操作符而不会过多考虑他们正在做什么,有时会以错误的方式重载它们;编译器很容易就是这个并接受它,但是,它可能不是重载该运算符的正确方法。
按照我提供给你的指南,这是一种以正确方式做事的好方法。
因此,请务必注意运算符在没有良好实践(超出标准)的情况下过载的示例,首先参考标准方法,然后使用符合它们的那些示例。