最近我正在學習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骯髒的參考?
謝謝你的時間。
最近我正在學習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骯髒的參考?
謝謝你的時間。
在這種情況下,編譯器將生成一個未命名的臨時值,其引用將被傳遞給function_a
。您的代碼將大致相當於:
int temporary = function_b();
function_a(temporary);
的temporary
範圍持續到調用function_a()
(這是無關緊要的一個整數,但可確定何時調用析構函數對於更復雜的對象的語句的結束)。
這是真的嗎?我一直認爲'return 1'返回一個不變的左手常量。 – 2010-08-18 03:56:16
@Delan Azabani:原始問題已更新爲包含'const'。 – 2010-08-18 04:56:47
@Delan Azabani:'int foo();'實際上是一個* rvalue *表達式(r,不是l) – 2010-08-18 07:42:10
這個問題是沒有意義的。該類型的操作無法編譯。
錯誤C2664:「function_a」:無法從「詮釋」轉換參數1「詮釋&」
我很抱歉,我忘記了function_a參數中的const。 – 2010-08-18 04:17:44
你需要如下寫。
'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());
}
感謝您的提醒。 '我'是否在function_a的範圍內是安全的? – 2010-08-18 04:23:35
是的。臨時是安全的,直到完整表達 function_a(function_b()); – Chubsdad 2010-08-18 04:51:41
我要再次看書,謝謝。 – 2010-08-18 05:54:53
沒有,有沒有機會,這將失敗。至少在聲明結束之前,由function_b
返回所創建的臨時保證將保持存在。
Temporaries最後到它們被創建的完整表達式的末尾。function_b()的結果是一個臨時的,它會持續到語句結束。 ('function_a'可以使用它,但它是想要的。) – GManNickG 2010-08-18 04:38:24
感謝您的解釋。 – 2010-08-18 05:53:05