运算符++的返回值

这个问题在这里已经有了答案:

  • 运算符重载的基本规则和习惯用法是什么? 7个答案

  • 您尝试将第二个++应用于第一个调用返回的临时对象。 但是,操作数必须通过引用传递,并且不能将临时值绑定到非常量左值引用。

    你可能不想“修复”这个,因为没有必要修改这样的临时值。 但是,您应该在增加值之前返回该值的副本,以提供预期的后增量行为。

    前缀运算符应返回一个引用,该引用可以愉快地绑定到另一个引用,以便++++x; 应该按预期工作。


    通过编写x++ ++来增加内部operator++的返回值。 这意味着如果该运算符的返回值不是可以修改的,则代码将不会编译。

    所以如果你声明它返回Number而不是Number & ,那么它就不能被修改(函数的返回值是一个临时的而不是一个左值,除非它是一个引用,因此外层操作符++,它接受它(非-const)引用,无法将其绑定到由值返回的对象)。


    你想要做的是非常不寻常的。 后增量通常在增量之前返回一个代表对象的右值(与预先增加相反,先增加对象然后将该对象本身返回为左值)。 出于无法解释的原因,您基本上试图使后增量的行为与预增量相同。

    通常情况下,你会做这样的事情:

    class Number {
      int n;
    public:
      // Pre-increment
      Number& operator++() {
        ++n;
        return *this;
      }
      Number operator++(int) {
        Number temp = *this;  // capture old value
        ++(*this);
        return temp;
      }
    };
    

    有了这个定义, x++++不会编译 - 但是当x是一个int时它也不会编译:它没有多大意义。

    无论如何,它不适合你的原因如下。 x++++被解释为

    operator++(operator++(x, 0), 0)
    

    内部operator++调用返回一个临时的Number对象。 外部operator++()需要一个类型为Number&的参数,但非const引用不能绑定到临时对象。 当你改变声明以便operator++返回Number& - 一个左值时 - 那么这个返回值可以愉快地传递给外层operator++调用。

    链接地址: http://www.djcxy.com/p/12695.html

    上一篇: Return value of operator++

    下一篇: Operator overloading outside class