临时量

          有时候在求表达式求值期间,编译器必须创建临时对象。像其他任何对象一样,

临时对象也需要存储空间,并且必须能够构造和销毁。区别是从来看不到临时对象,

因为是由编译器负责决定它们的去留以及它们存在的细节。但是关于临时变量有这

样一种情况,它们自动地成为常量。通常接触不到临时对象,改变临时对象是错误的,

因为这些信息应该是不可得到的。编译器所使用的临时变量自动生成为const。如:

下面这段代码就会报错:

#include<iostream>
using namespace std;
int fun()
{
	return 2;
}
int Foo(int &x)
{
	return ++x;
}
int main()
{
	int a=Foo(fun());
	cout<<a<<endl;
	return 0;
}

编译器会提示错误:非常量引用的初始值必须为左值

在Foo(fun())中,编译器必须产生一个临时对象来保存fun()的值,使得它能够传递给Foo()。如果

Foo()是值传递的话程序就不会报错。但是Foo()是引用传递,这意味着它取临时对象的地址,由于

Foo的参数不是按照cosnt引用传递的,所以它可以对临时对象进行修改,然而临时对象自动设为

const,而const对象是不能被修改的。对于int &x,从效果上讲,可以等效理解为int *p,由于临时

对象为const类型,而P不能指向const类型的对象。


但是下面的程序却是合法的,如:

#include<iostream>
using namespace std;
class T
{
private:
	int i;
public:
	T(int ii=0);
	void show();
};
T::T(int ii){i=ii;}
void T::show(){cout<<i<<endl;}
T fun()
{return T();}
int main()
{
	T t=fun();
	t.show();
	fun()=T(2);
	return 0;
}

尽管它们能够编译,但是还是存在问题的。fun()返回一个对象,编译器会创建临时对象

来保存返回值,但是在这个fun()=T(2)这个表达式中临时对象被修改,但是表达式被编译过

后临时对象也被清除,结果丢失了所有的修改,但是编译器却不会有任何提示。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值