【发布时间】:2010-11-29 17:27:38
【问题描述】:
C++ 标准将使用下标的表达式定义为后缀表达式。 AFAIK,这个运算符总是有两个参数(第一个是指向 T 的指针,另一个是枚举或整数类型)。因此,它应该有资格作为二元运算符。
那么问题来了,什么是下标运算符?它是一元的还是二元的?当然,它不是一元的,因为它在 5.3 美元中没有提到(至少直截了当)。
当标准在后缀表达式的上下文中提到它的用法时,这是什么意思?
【问题讨论】:
C++ 标准将使用下标的表达式定义为后缀表达式。 AFAIK,这个运算符总是有两个参数(第一个是指向 T 的指针,另一个是枚举或整数类型)。因此,它应该有资格作为二元运算符。
那么问题来了,什么是下标运算符?它是一元的还是二元的?当然,它不是一元的,因为它在 5.3 美元中没有提到(至少直截了当)。
当标准在后缀表达式的上下文中提到它的用法时,这是什么意思?
【问题讨论】:
我倾向于同意你的观点,因为operator[] 是最严格意义上的二元运算符,因为它确实需要两个参数:一个(可能是隐式的)对对象的引用,以及一个其他类型的值(不一定是枚举或整数)。但是,由于它是一个括号运算符,您可能会说标记序列[x],其中x 可能是任何有效的下标表达式,在抽象意义上可以作为后缀一元运算符;想想柯里化。
此外,例如,您不能重载全局 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[] 一般而言是二元的,尽管有可能将其设为一元,但它应该始终在类内用作二元,即使它在类外没有意义。
在我提供给你的链接中有很好的解释...... 请注意,有时许多程序员重载运算符而没有过多考虑他们在做什么,有时会以不正确的方式重载它们;编译器很容易接受并接受它,但可能不是重载该运算符的正确方法。
遵循我提供给您的指南,是一种以正确方式做事的好方法。
因此,请始终注意在没有良好实践(超出标准)的情况下重载运算符的示例,请首先参考标准方法,然后使用符合它们的示例。
【讨论】: