2014-04-03 17 views
1

常識是非常量引用不能綁定到臨時對象(不能延長其生存期)。問題是,下面的程序,甚至沒有一個警告編譯將非常量引用綁定到臨時對象 - 可能發生的示例

#include <iostream> 

struct Type 
{ 
    int m; 
    Type b() { 
     Type ret = {1}; 
     return ret; 
    } 
    Type& c() { 
     return *this; 
    } 
}; 

int main() 
{ 
    Type a; 
    Type &obj = a.b().c(); // b() returns a temporary and c() a reference to that! 
    std::cout << obj.m << std::endl; 
    return 0; 
} 

B()返回一個臨時和c()的引用到! this怎麼可能?

PS:事實上,它比我輸出正確結果的事實編寫更多;完全可以理解的是,臨時使用的記憶在使用之前可能沒有受到傷害。

+0

當然你可以:'extern int f(); int && r = f();' –

+0

這是一個右值引用 –

+0

那麼,右值引用也是引用。或者你是某種參照種族主義者? –

回答

3

術語「臨時」指的是一個函數調用表達式f()其中f被聲明爲T f();T是一個非參考對象類型的返回值。顯然,您的調用表達式a.b().c()不是臨時的,因爲c的聲明返回類型是引用類型。

爲了評估函數調用,沒有創建臨時對象

c是一個成員函數,它本身在臨時上評估的事實並不重要。 (不過,當然你的代碼產生懸空參考;這是不確定的行爲,以評估obj


(在正確的地方,解決您關注的是資格的成員函數,如Type & c() &等,確保實例參數本身是一個左值。)

相關問題