2012-07-19 32 views
53

可能重複:
Does a const reference prolong the life of a temporary?返回臨時對象,並結合const引用

我的編譯器不抱怨爲const參考分配臨時:

string foo() { 
    return string("123"); 
}; 

int main() { 
    const string& val = foo(); 
    printf("%s\n", val.c_str()); 
    return 0; 
} 

爲什麼?我認爲從foo返回的字符串是臨時的,val可以指向哪個對象的生命週期已經完成。 C++標準是否允許這樣做並延長返回對象的生命週期?

+4

是的,只要是** const **參考,臨時的生命週期就會延長。 – chris 2012-07-19 11:56:47

+2

這不完全是2784262的副本,它應該處理引用是類成員的情況。行爲是不同的。 – aberaud 2014-11-29 20:54:55

+1

@aberaud不僅這不是重複的,這是一個更好的問題,我很高興我找到了。 – dashesy 2016-07-01 14:30:51

回答

66

這是一個C++特性。該代碼是有效的,並且看起來確實如此。

通常,臨時對象只會持續到它出現的完整表達式的結尾。但是,C++故意指定將臨時對象綁定到堆棧上對const的引用會將臨時的生命週期延長到引用本身的生命週期,從而避免了常見的懸空引用錯誤。在上面的例子中,由foo()返回的臨時值直到最後一個大括號結束。

P.S:這隻適用於基於堆棧的引用。它不適用於作爲對象成員的引用。

全文:GotW #88: A Candidate For the 「Most Important const」 by Herb Sutter

+2

此外,請注意,通過在此處對字符串不做任何複製,字符串的複製構造函數必須存在並且可以訪問。 – xryl669 2013-11-25 16:53:12

+0

重新** ** PS **,這是非常重要的,和上面鏈接的重複SO線程有這個好插圖 – 2016-03-06 02:27:10

+0

@ xryl669是否[C++ 17保證副本elision](http://www.open-std。 org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html)是否意味着複製構造函數不再需要?引用:''當源對象是臨時''' – dashesy 2016-07-01 15:09:50