一、临时对象的来源主要有两个,一个是传递参数的时候进行隐式转换,另外一个是函数返回对象时候
隐式转换:
void f(string& temp);
char a[]={abcd"};
f(a);
在这里会报错,因为a是char*类型,把一个char*类型转换为string类型中间需要一个临时变量,临时变量把char*转换成string,然后赋值给temp,但是因为修改temp就会修改这个临时变量,但却不会修改a,因此这样做是没有任何意义的,所以编译器不允许临时变量被修改,故这样做是错误的,可以给参数加个const,确保在函数内不会改变变量,这里举这个例子是为了说明这样的过程就会产生临时变量,也导致效率问题,因此应尽量避免这种隐式转换带来的效率问题
二、函数返回对象时候
A a(){...;return *this;}
会调用拷贝构造函数和析构函数
A& a(){...;return *this;}
不会调用拷贝构造函数和析构函数
应该都能够作为左值
当返回一个变量时,会产生拷贝。当返回一个引用时,不会发生拷贝,你可以将引用看作是一个变量的别名,就是其他的名字,引用和被引用的变量其实是一个东西,只是有了两个名字而已。
问题的关键是,当你想要返回一个引用而不是一个拷贝时,你要确保这个引用的有效性,比如:
int & fun() { int a; a=10; return a; }
这样是不行的,因为a会在fun退出时被销毁,这时返回的a的引用是无效的。
这种情况下,如果fun的返回类型不是int & 而是int就没有问题了。
因此,要返回一个引用时,“临时变量”不能是“临时”的,至少得等函数外部使用完毕这个引用之后,才能销毁它。