首页 > 解决方案 > 为什么这个函数可以返回一个 C++ int 引用?

问题描述

最近,我在阅读C++ Primer,它说:

当一个函数完成时,它的存储空间被释放。函数终止后,对本地对象的引用指向不再有效的内存

因此,我在 Visual Studio 2019 中键入以下代码:

int& returnRef()
{
    int n = 2;
    return n;
}

int main()
{
    int ref = returnRef();
    cout << ref;
}

我认为这应该是一个案例错误,但它没有并在命令上打印了正确的值。我很困惑。对此有解释吗?

我是 C++ 新手。

编辑:

谢谢伙计/女孩。看起来这个问题与编译器有关。我知道了。

顺便说一句,我发布了另一个关于在 vs2019 中启用编译器警告的问题: 如何在 Visual Studio 2019 中启用编译器警告?

标签: c++

解决方案


C++ 标准没有明确声明此类代码应导致编译器诊断。然而,它仍然具有未定义的行为:它可能会或可能不会工作,它可能会在重新执行或在不同的机器上或使用不同版本的编译器重新编译时改变行为。大多数编译器都会发出警告,只要您在编译时激活它们(例如,在 GCC 中使用 -Wall 或在 Visual Studio 中使用 /Wall)。例如 GCC 10 显示:

prog.cc: In function 'int& returnRef()':
prog.cc:4:12: warning: reference to local variable 'n' returned [-Wreturn-local-addr]
    4 |     return n;
      |            ^
prog.cc:3:9: note: declared here
    3 |     int n = 2;
      |         ^

推荐阅读