什麼是應該發生在以下情況:傳遞返回值的函數的參考
int functionA() {
return 25;
}
void functionB(const int& ref) {
cout << ref << endl;
}
void start() {
functionB(functionA());
}
編譯此示例時,它輸出正確的值25。這是如何工作的?當僅使用對引用的返回值時,是否應該刪除(從堆棧中移除)引用的返回值,還是行爲未定義?
什麼是應該發生在以下情況:傳遞返回值的函數的參考
int functionA() {
return 25;
}
void functionB(const int& ref) {
cout << ref << endl;
}
void start() {
functionB(functionA());
}
編譯此示例時,它輸出正確的值25。這是如何工作的?當僅使用對引用的返回值時,是否應該刪除(從堆棧中移除)引用的返回值,還是行爲未定義?
這個「作品」,因爲const int& ref
- 當一提的是const
(保證你不想改變它),編譯器會產生調用代碼的臨時對象(start
你的情況),然後通過參考。
如果您刪除const
它將無法編譯,因爲functionA
的結果不能轉換爲引用。
沒有「在棧上返回值」(更不用說「堆疊」):functionA
返回int
由值,所以表達式functionA()
只是int
類型的臨時值。該值綁定到functionB
中的常量引用,並且由於其生命週期是完整表達式的生命週期,所以一切都很好。
請參閱C++ 11標準12.2/4,5,瞭解臨時對象的常量引用的影響 – nijansen