为什么返回带引用类型的局部变量在VS2012中有效

Leo*_*Leo -2 c++ visual-c++

我在下面的代码中很困惑,这在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;
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解并参考类似的问题C++返回对局部变量的引用,它应该失败,因为i函数中的局部变量的生命周期func应该在函数调用之后结束.

但是,为什么它在VS2012中有效?

在VS2012中运行

g ++ 8.1.1失败 g ++ build with warning

在此输入图像描述

这让我无法入睡.

更新v1:
添加VS2012指定版本并更改代码以使用变量ri.

小智 5

这是未定义的行为,这可能随机起作用,因为堆栈帧不会被新值覆盖并且能够访问内存位置(其中包含垃圾).我们永远不应该返回对局部变量的引用.