int foo(int n)
{
return n;
}
void bar(int n)
{
return ;
}
struct wrap_int
{
wrap_int(int _n): n(n) {}
operator int() { return n; }
operator int()const { return n; }
wrap_int operator ++() { return ++n; }
int n;
};
wrap_int foo(wrap_int n)
{
return n;
}
int main()
{
bar(++foo(372)); //~ 此行报错
bar(++foo(wrap_int(372))); //~ 无错
return 0;
} |
第一个bar调用中foo返回int型临时对象,想要把这个int临时对象++后传给bar,未遂。第二个bar调用中,foo返回一个包装过的int, 即wrap_int,对这个临时对象进行++(重载),得逞。结论:C++中,基本类型(内置类型)的临时对象不可以作为左值(l-value),即不可以修改;用户自定义类型的临时对象可以作为左值。
而且vector::iterator很可能会以裸露的指针来实现,这时对vec.begin()进行++操作就会出错。而对于deque,由于其特殊的内存模型,其iterator不可能是普通的指针,也就不存在这种错误。