看看这个C ++代码:
#include <iostream>
using namespace std;
class B{
public:
int& f() {
int local_n = 447;
return local_n ;
} // local_n gets out of scope here
};
int main()
{
B b;
int n = b.f(); // and now n = 447
}
我不明白为什么n = 447在main的末尾,因为我试图返回对local_n的引用,当它应该是NULL时;
答案 0 :(得分:1)
返回对局部变量的引用会调用未定义的行为 - 这意味着您可能会幸运,它可能会工作......有时......或者它可能会格式化您的硬盘或召唤鼻子恶魔。在这种情况下,编译器生成的代码在被其他东西覆盖之前设法将旧值复制到堆栈之外。哦,引用没有相应的NULL值...
编辑 - 这是一个返回引用是一件坏事的例子。在上面的示例中,由于您在调用其他任何内容之前立即将值复制到引用之外,因此很可能(但远非保证)它可能在大多数情况下都可以工作。但是,如果您将另一个引用绑定到返回的引用,那么事情看起来不会那么好:
extern void call_some_other_functions();
extern void lucky();
extern void oops();
int& foo()
{ int bar = 0;
return bar;
}
main()
{ int& x = foo();
x = 5;
call_some_other_functions();
if (x == 5)
lucky();
else
oops();
}