2016-05-26 104 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,而是通過值返回創建的。