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

时间:2018-06-15 02:55:00

标签: 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;
}

根据我理解并引用类似的问题C++ Returning reference to local variable,它应该失败,因为函数i中的局部变量func的生命周期应该在函数调用之后结束。 / p>

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

running in VS2012

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

enter image description here

这让我无法入睡。

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

我刚刚使用Visual Studio 2012 Update 4Visual Studio 2013 Update 5Visual Studio 2015 Update 3和Visual Studio 2017(15.7 update)尝试了此代码。

在正常警告(http://localhost:3000/test)下,所有四个结果都是:

  

警告C4172:返回本地变量的地址或临时:i

也许你的警告级别太低了? (/W3/W0)。

至于为什么它可以工作,可能是因为你立即将引用转换为值类型,所以你从来没有真正尝试将地址用于任何有趣的事情。正如其他人所指出的那样,就C ++语言而言,这是正式的“未定义行为”。

/W1