【发布时间】:2018-05-22 11:41:44
【问题描述】:
最近我在一个项目中遇到了一个问题。那里的代码比下面的例子复杂得多,但我希望问题(如果有的话)是一样的。
#include <iostream>
class mObject
{
public:
mObject(){ std::cout << "mObject ctor\n"; }
mObject(const mObject& other){ std::cout << "mObject copy ctor\n"; }
~mObject(){ std::cout << "mObject dtor\n"; }
};
struct cFoo{
cFoo(const mObject& obj):obj_(obj){}
const mObject& get() { return obj_;}
const mObject& obj_;
};
mObject giveme() { return mObject(); }
void func2(const mObject& p) { mObject g = p; }
int main()
{
cFoo k(giveme());
func2(k.get());
return 0;
}
这给了我以下代码:
mObject ctor
mObject dtor
mObject copy ctor
mObject dtor
所以原来的“临时”mObject 实例在func2 使用它之前就死掉了。我认为如果有一个const& 可以延长临时object 的寿命。在函数main 中将giveme() 的返回分配给本地const& 解决了这个问题。然后临时生命直到main 的范围结束。那么这里发生了什么???
【问题讨论】:
-
终身扩展适用于绑定到本地引用的临时(或临时的一部分)。在这种情况下,编译器可以简单地将临时变量视为局部变量。在函数调用中传递引用时,这是不可能的。
标签: c++ temporary-objects const-reference