c++ - 为什么这个函数可以返回一个 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++ 标准没有明确声明此类代码应导致编译器诊断。然而,它仍然具有未定义的行为:它可能会或可能不会工作,它可能会在重新执行或在不同的机器上或使用不同版本的编译器重新编译时改变行为。大多数编译器都会发出警告,只要您在编译时激活它们(例如,在 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;
| ^
推荐阅读
- java - SWT Text:删除 Linux 中的默认上下文菜单项
- c++ - 取消引用 void 指针以将值分配给结构
- python - 如何根据用户在 Dash Plot 中的特定输入处理 Dash Plot for Graph 中的回调
- html - 问题输出角表html实体
- javascript - 无法使用 .addClass() 方法为 html 中的复选框添加类
- aws-lambda - 集成响应 SAM 模板
- c# - NavigationBar 中的 Xamarin 窗体图像不可见
- javascript - 防止 vs 代码将 Express JS 代码格式化为换行符
- rest - 是否更喜欢在同一个项目中使用 GraphQL 进行查询和 REST 进行变异操作?
- javascript - 图片上传jodit编辑器中的自定义url