在下面的代码中,将演示两个函数。f1()返回函数作用域中初始化局部变量的引用,f2()返回函数作用域中初始化局部变量的值。
f2()应该运行良好,因为本地初始化变量。值从堆栈传递到主值。
f1()不能工作,因为局部变量的引用在函数范围之外是无用的。但是,对于这两个函数,输出似乎都正常。
这是测试代码;
#include <iostream>
using namespace std;
// function declarations
int& f1();
int f2();
int main()
{
cout << "f1: " << f1() << endl; // should not work!
cout << "f2: " << f2() << endl; // should work
return 0;
}
int& f1() // returns reference
{
int i = 10; // local variable
return i; // returns reference
}
int f2() // returns value
{
int i = 5; // local variable
return i; // returns value
}
输出如下;
f1: 10
f2: 5
为什么f1()工作正常,即使f1()返回局部变量的引用?
发布于 2015-10-20 03:19:37
欢迎来到未定义行为!
你就是这么做的。您可以访问超出作用域的变量。然而,这可能是因为系统没有在已经存在的值上写一些东西,从而解释了这种行为。
这就是为什么在实际代码中很难找到这样的逻辑错误的原因。因为您可能(Un)幸运,并且变量具有正确的值(在特定的执行中)。
因此,f1()
的返回值是对超出范围的东西的引用,而f2()
的返回值是该函数局部变量的副本,这是可以的。
但是,下降编译器应该对此发出警告,并发出这样的警告:
警告:引用局部变量‘i’返回-返回-本地-addr
请在编译器中启用警告标志。:)
https://stackoverflow.com/questions/33235206
复制相似问题