临时对象

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不可能是普通的指针,也就不存在这种错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值