2016-05-26 67 views
1

我不知道当(另一个)函数创建临时对象并返回时是否可以安全地调用临时对象的成员函数。对函数返回的临时对象(函数返回后)调用成员函数是否安全?

下面是一个例子:

string getString(const string &str) 
{ 
    string tempStr = str + str; 

    return tempStr; 
} 

int main() 
{ 
    if(getString("aaaaa").compare("bbbb") == 0) { // is it safe? 
     // do something 
    } 
} 

我也使寿命试验如下。

class Foo 
{ 
public: 
    Foo() 
    { 
     cout << __PRETTY_FUNCTION__ << " :" << this << endl; 
    } 

    ~Foo() 
    { 
     cout << __PRETTY_FUNCTION__ << " :" << this << endl; 
    } 

    void show() 
    { 
     cout << this << endl; 
    } 
}; 

Foo func(void) 
{ 
    return Foo(); 
} 

int main() 
{ 
    func().show(); 
    return 0; 
} 

结果:

富::美孚():0x7fff4d03d3bf
无效美孚::显示():0x7fff4d03d3bf
富::〜美孚():0x7fff4d03d3bf

似乎析构函数将在成员函数完成后启动。 但是,这取决于编译器?

PS:我使用的编译器为g ++ v 5.3.1 由于

回答

9

通过它返回值的对象函数的返回语句创建的临时对象住至少直到调用该整个语句函数完成。所以这是安全的。

您没有看到tempStr因为返回值优化而被破坏。但是即使tempStr被破坏,代码仍然是100%安全的,因为临时访问的不是tempStr,而是通过值返回创建的。