[英]about returning a const reference to a temporary argument
我正在使用Ubuntu下的g ++ 4.8.4進行編譯。
我無法理解為什么下面的代碼工作正常意味着打印總是在控制台上輸出一些而不會崩潰。
我相信函數foo()
被賦予一個臨時對象,該對象將持續到函數foo()
完成其執行。
當然輸出參數將指向已分配臨時值的堆棧上的相同地址,但我驚訝地發現每次調用A::hello()
可以正常工作。
我認為應該避免對該區域內存的任何訪問。
我想用'valgrind'仔細檢查,它也說一切都好。 我嘗試用-Wstack-protector
重新編譯,什么都沒有。
你知道為什么會這樣嗎? 我的信念是錯的,還是僅僅是那些最不可避免的“未定義”C ++行為之一?
#include <iostream>
using namespace std;
struct A {
A(): a(10) { cout << "a" << endl; }
~A() {cout << "bye" << endl; }
void hello() const { cout << "hi " << a << endl; }
};
const A& foo(const A& a = A()) {
return a;
}
int main() {
for( int i = 0; i < 10 ; i++) {
const A& a = foo();
a.hello();
}
return 0;
}
Output
'a'
'bye'
'hi 10'
'a'
'bye'
'hi 10'
...
行為未定義。
將const
引用綁定到匿名臨時將該匿名臨時的生存期延長到該const
引用的生命周期。
但是,試圖重新綁定返回引用的a
在foo
不會延長壽命:壽命延長是不可傳遞的 。 所以a
是main()
的懸空引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.