2010-08-18 143 views
4

最近我正在學習C++,並對以下情況有一些疑問。C++函數返回範圍和參考

void function_a(const int &i){ 
    //using i to do something 
} 

int function_b(){ 
    return 1; 
} 

好吧,如果我要打電話......

function_a(function_b()); 

是有任何機會,function_a讀取來自它的PARAM骯髒的參考?

謝謝你的時間。

+5

Temporaries最後到它們被創建的完整表達式的末尾。function_b()的結果是一個臨時的,它會持續到語句結束。 ('function_a'可以使用它,但它是想要的。) – GManNickG 2010-08-18 04:38:24

+0

感謝您的解釋。 – 2010-08-18 05:53:05

回答

2

在這種情況下,編譯器將生成一個未命名的臨時值,其引用將被傳遞給function_a。您的代碼將大致相當於:

int temporary = function_b(); 
function_a(temporary); 

temporary範圍持續到調用function_a()(這是無關緊要的一個整數,但可確定何時調用析構函數對於更復雜的對象的語句的結束)。

+0

這是真的嗎?我一直認爲'return 1'返回一個不變的左手常量。 – 2010-08-18 03:56:16

+0

@Delan Azabani:原始問題已更新爲包含'const'。 – 2010-08-18 04:56:47

+0

@Delan Azabani:'int foo();'實際上是一個* rvalue *表達式(r,不是l) – 2010-08-18 07:42:10

0

這個問題是沒有意義的。該類型的操作無法編譯。

錯誤C2664:「function_a」:無法從「詮釋」轉換參數1「詮釋&」

+0

我很抱歉,我忘記了function_a參數中的const。 – 2010-08-18 04:17:44

2

你需要如下寫。

'i'無法綁定到從'function_b'返回的臨時值。這是毫無髒參考這裏作爲一個「臨時」這裏所涉及的,而當地的功能(這超出範圍,一旦「function_b的回報率)的參考問題

void function_a(int const &i){ 
    //using i to do something 
} 

int function_b(){ 
    return 1; 
} 

int main(){ 
    function_a(function_b()); 
} 
+0

感謝您的提醒。 '我'是否在function_a的範圍內是安全的? – 2010-08-18 04:23:35

+0

是的。臨時是安全的,直到完整表達 function_a(function_b()); – Chubsdad 2010-08-18 04:51:41

+0

我要再次看書,謝謝。 – 2010-08-18 05:54:53

4

沒有,有沒有機會,這將失敗。至少在聲明結束之前,由function_b返回所創建的臨時保證將保持存在。