我在 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
引用绑定(bind)到匿名临时值会将匿名临时值的生命周期延长到该 const
引用的生命周期。
但尝试重新绑定(bind)对 foo
中的 a
的返回引用将不会延长生命周期:生命周期延长不是传递。所以 a
是 main()
中的一个悬挂引用。
关于c++ - 关于返回对临时参数的 const 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34419291/