我对以下代码感到困惑,这些代码在VS2012 Update 5中有效但在g ++ 8.1中失败了。
int& func()
{
int i = 0;
return i;
}
int main()
{
int ri = func();
ri++;
std::cout << ri << std::endl; // output "1"
return 0;
}
根据我理解并引用类似的问题C++ Returning reference to local variable,它应该失败,因为函数i
中的局部变量func
的生命周期应该在函数调用之后结束。 / p>
但是,为什么它在VS2012中有效?
这让我无法入睡。
更新了v1 :
添加VS2012指定版本并更改代码以使用变量ri
。
答案 0 :(得分:5)
这是未定义的行为,这可能随机起作用,因为堆栈帧不会被新值覆盖并且能够访问内存位置(其中包含垃圾)。我们永远不应该返回对局部变量的引用。
答案 1 :(得分:1)
我刚刚使用Visual Studio 2012 Update 4,Visual Studio 2013 Update 5,Visual Studio 2015 Update 3和Visual Studio 2017(15.7 update)尝试了此代码。
在正常警告(http://localhost:3000/test
)下,所有四个结果都是:
警告C4172:返回本地变量的地址或临时:i
也许你的警告级别太低了? (/W3
或/W0
)。
至于为什么它可以工作,可能是因为你立即将引用转换为值类型,所以你从来没有真正尝试将地址用于任何有趣的事情。正如其他人所指出的那样,就C ++语言而言,这是正式的“未定义行为”。
/W1