我正在使用Ubuntu下的g ++ 4.8.4進行編譯。關於將const引用返回給臨時參數
我不明白爲什麼下面的代碼工作正常意味着總是在控制檯上打印一些輸出而不會崩潰。
我相信功能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'
...
未定義的行爲可以做*任何*,包括看起來工作。在這種情況下,該值在打印之前不會被覆蓋。 – BoBTFish