首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于引用延长临时对象生命期的有关问题

2014-01-22 
关于引用延长临时对象生命期的问题class A{public:~A(){ cout end A endl }A& Show(){ cout

关于引用延长临时对象生命期的问题


class A
{
public:
    ~A(){ cout << "end A" << endl; };

     A& Show(){ cout << "show" << endl;return *this; }
};

A fun()
{
    return A();
}

A &a = fun().Show(); // 这里



如上,我本以为执行完“fun().Show()”后,a依旧能引用到函数fun调用后返回的临时对象,可是结果却发现,“fun().Show()”调用之后那个临时对象就析构了。

百思不得其解,莫非是调用fun函数后,其返回的临时对象并没有立即的被a引用,而是用这个临时对象调用Show函数,进而导致a没能“第一时间”引用上临时对象,结果导致调用完show函数后析构了?
[解决办法]
引用:
是 const 引用
const A &a = fun().Show();

呃这个错误

show返回的不是临时变量.所以const &也无法延长生存周期.

#include <iostream>
using namespace std;
class A
{
public:
    ~A(){ cout << "end A" << endl; };
 
void Show()const{ cout << "show" << endl; }
};
 


A fun()
{
    return A();
}
 
int main()
{
const A &a = fun();
a.Show(); // 
puts("a");
}

[解决办法]
函数返回引用,不是临时对象。

fun()

返回的确实是个A的临时对象。

Show()

返回的是个引用,不是临时对象,所以不能延长它返回东西的生命周期,但关键问题是它引用的是fun()返回的一个临时对象,于是语句结束,fun()返回的临时对象就被回收了~
[解决办法]
 The language says "temporaries die at the end of the statement, unless they are bound to const reference, in which case they die when the reference goes out of scope". Applying that rule, it seems a is already dead at the beginning of the next statement, since it's not bound to const reference (the compiler doesn't know what fun() returns). This is just a guess however.
[解决办法]
我看了下原文,是这样说的:

So the rule is that a temporary bound to a reference persists for the lifetime of the reference initialized or until the end of the scope in which the temporary is created, whichever comes first.

后半句话所对应的场景应该如下:


const A& fun()
{
    return A();
}
const A &a = fun();


热点排行