实际上我是在看STL中关于iterator的实现才意识到这个问题的。
- ++ i 返回的是i自增之后的引用,所以是一个左值
int i = 0; int& j = ++i; // OK j++; cout << i << " " << j << endl; // i == j == 2;
- 而i++ 返回的是一个值为i 的副本,所以是一个右值
int& j = i++; // failed , i++ 的返回值是一个匿名的变量,编译器禁止引用一个匿名变量 const int& j = i++; // OK ,但是作用不大
关于 ++ 运算符重载的一个例子
#include <iostream>
using namespace std;
class test
{
public:
int val;
test():val(0){};
// 先自增运算符
test& operator ++ ()
{
val++;
return *this;
}
// 重载后自增运算符
test operator ++ (int)
{
test tmp = *this;
val++;
return tmp;
}
};
int main()
{
test c;
cout << (++c).val << endl; // 1
cout << (c++).val << endl; // 0
}
Edit By MaHua