C++ 标准使用下标将表达式定义为后缀表达式。AFAIK,这个运算符总是有两个参数(第一个是指向 T 的指针,另一个是枚举或整数类型)。因此,它应该有资格作为二元运算符。
那么问题来了,什么是下标运算符?它是一元的还是二元的?当然,它不是一元的,因为它在 5.3 美元中没有提到(至少直截了当)。
当标准在后缀表达式的上下文中提到它的用法时,这是什么意思?
我倾向于同意你的观点operator[]
,因为它是最严格意义上的二元运算符,因为它确实需要两个参数:对对象的(可能是隐式的)引用,以及其他类型的值(不一定是枚举或整数) . 但是,由于它是一个括号运算符,您可能会说标记序列([x]
其中x
可能是任何有效的下标表达式)在抽象意义上符合后缀一元运算符的条件;想咖喱。
此外,例如,您不能重载 global operator[](const C&, size_t)
。编译器抱怨operator[]
必须是非静态成员函数。
我认为这是 [] 用于重要的上下文。第 5.2.1 节符号 [] 用于后缀表达式的上下文中,该表达式“与 *((E1)+(E2)) 相同(根据定义)”。在这种情况下, [] 不是运算符。在第 13.5.5 节中,它用于表示下标运算符。在这种情况下,它是一个接受一个参数的运算符。例如,如果我写:
x = a[2];
上述语句的计算结果不一定是:
x = *(a + 2);
因为'a'可能是一个对象。如果 a 是对象类型,那么在此上下文中,[] 用作下标运算符。
无论如何,这是我可以从解决明显矛盾的标准中得出的最佳解释。
如果您仔细查看http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B,它将向您解释标准 C++ 将 operator[] 识别为二元运算符,如您所说。Operator[] 通常是二元的,尽管有可能将其设为一元,但它应该始终在类内用作二元,即使它在类外没有意义。
我提供给您的链接中对此进行了很好的解释...请注意,有时许多程序员重载运算符而没有过多考虑他们在做什么,有时会以不正确的方式重载它们;编译器很容易接受并接受它,但可能不是重载该运算符的正确方法。
遵循我提供给您的指南是一种以正确方式做事的好方法。
因此,请始终注意在没有良好实践(超出标准)的情况下重载运算符的示例,请首先参考标准方法,并使用符合它们的示例。