【问题标题】:subscript operator postfix下标运算符后缀
【发布时间】:2010-11-29 17:27:38
【问题描述】:

C++ 标准将使用下标的表达式定义为后缀表达式。 AFAIK,这个运算符总是有两个参数(第一个是指向 T 的指针,另一个是枚举或整数类型)。因此,它应该有资格作为二元运算符。

但是MSDNIBM 并未将其列为二元运算符。

那么问题来了,什么是下标运算符?它是一元的还是二元的?当然,它不是一元的,因为它在 5.3 美元中没有提到(至少直截了当)。

当标准在后缀表达式的上下文中提到它的用法时,这是什么意思?

【问题讨论】:

    标签: c++ binary subscript


    【解决方案1】:

    我倾向于同意你的观点,因为operator[] 是最严格意义上的二元运算符,因为它确实需要两个参数:一个(可能是隐式的)对对象的引用,以及一个其他类型的值(不一定是枚举或整数)。但是,由于它是一个括号运算符,您可能会说标记序列[x],其中x 可能是任何有效的下标表达式,在抽象意义上可以作为后缀一元运算符;想想柯里化。

    此外,例如,您不能重载全局 operator[](const C&, size_t)。编译器抱怨operator[] 必须是非静态成员函数。

    【讨论】:

      【解决方案2】:

      operator[] 是一个二元运算符是正确的,但它的特殊之处在于它也必须是一个成员函数。

      类似于operator()

      您可以阅读后缀表达式here

      我刚刚发现了一篇关于operator[] 和后缀表达式here 的有趣文章

      【讨论】:

        【解决方案3】:

        我认为重要的是 [] 使用的上下文。第 5.2.1 节符号 [] 用于后缀表达式的上下文中,该表达式“与 *((E1)+(E2)) 相同(根据定义)”。在这种情况下, [] 不是运算符。在第 13.5.5 节中,它用于表示下标运算符。在这种情况下,它是一个接受一个参数的运算符。例如,如果我写:

         x = a[2];
        

        上述语句的计算结果不一定是:

        x = *(a + 2);
        

        因为“a”可能是一个对象。如果 a 是对象类型,那么在此上下文中,[] 用作下标运算符。

        无论如何,这是我可以从解决明显矛盾的标准中得出的最佳解释。

        【讨论】:

          【解决方案4】:

          如果您仔细查看http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B,它将向您解释标准 C++ 将 operator[] 识别为二元运算符,如您所说。 Operator[] 一般而言是二元的,尽管有可能将其设为一元,但它应该始终在类内用作二元,即使它在类外没有意义。

          在我提供给你的链接中有很好的解释...... 请注意,有时许多程序员重载运算符而没有过多考虑他们在做什么,有时会以不正确的方式重载它们;编译器很容易接受并接受它,但可能不是重载该运算符的正确方法。

          遵循我提供给您的指南,是一种以正确方式做事的好方法。

          因此,请始终注意在没有良好实践(超出标准)的情况下重载运算符的示例,请首先参考标准方法,然后使用符合它们的示例。

          【讨论】:

            猜你喜欢
            • 2011-03-12
            • 1970-01-01
            • 2022-11-24
            • 2013-07-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多