运算符++的返回值
这个问题在这里已经有了答案:
您尝试将第二个++
应用于第一个调用返回的临时对象。 但是,操作数必须通过引用传递,并且不能将临时值绑定到非常量左值引用。
你可能不想“修复”这个,因为没有必要修改这样的临时值。 但是,您应该在增加值之前返回该值的副本,以提供预期的后增量行为。
前缀运算符应返回一个引用,该引用可以愉快地绑定到另一个引用,以便++++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++
调用。