2013-09-16 36 views
7

什麼是應該發生在以下情況:傳遞返回值的函數的參考

int functionA() { 
    return 25; 
} 

void functionB(const int& ref) { 
    cout << ref << endl; 
} 

void start() { 
    functionB(functionA()); 
} 

編譯此示例時,它輸出正確的值25。這是如何工作的?當僅使用對引用的返回值時,是否應該刪除(從堆棧中移除)引用的返回值,還是行爲未定義?

+1

請參閱C++ 11標準12.2/4,5,瞭解臨時對象的常量引用的影響 – nijansen

回答

8

這個「作品」,因爲const int& ref - 當一提的是const(保證你不想改變它),編譯器會產生調用代碼的臨時對象(start你的情況),然後通過參考。

如果您刪除const它將無法編譯,因爲functionA的結果不能轉換爲引用。

8

沒有「在棧上返回值」(更不用說「堆疊」):functionA返回int由值,所以表達式functionA()只是int類型的臨時值。該值綁定到functionB中的常量引用,並且由於其生命週期是完整表達式的生命週期,所以一切都很好。