c++ - 为什么 c++ 编译器不会警告返回对局部变量的引用?
问题描述
在下面的代码中,编译器会在调用 bar() 方法时警告返回对本地的引用。我也期待关于 foo() 方法的类似警告。
#include <iostream>
class Value {
public:
int& foo() {
int tc = 10;
int& r_tc = tc;
return r_tc;
}
int& bar() {
int tc = 10;
return tc;
}
};
int main() {
Value value;
int& foo_ref = value.foo();
int& bar_ref = value.bar();
std::cout << foo_ref << std::endl;
return 0;
}
编译输出:
g++ -c refreturn.cc -g -std=c++1z; g++ -o refreturn refreturn.o
refreturn.cc: In member function ‘int& Value::bar()’:
refreturn.cc:12:13: warning: reference to local variable ‘tc’ returned [-Wreturn-local-addr]
int tc = 10;
^
Compilation finished at Sat Mar 23 07:29:31
解决方案
“为什么 c++ 编译器不警告返回对局部变量的引用?”
因为编译器并不完美,最终你有责任不编写无效代码。编译器没有义务对所有错误发出警告(事实上,它有义务对很少发出警告,但大多数尝试比最低要求做得更好)。
推荐阅读
- c# - Exchange2010_SP2 版本的 Exchange api 过滤问题
- api - 如何首次将与会者添加到日历活动?
- jena - 为什么 Jena fuseki 对猫头鹰的推理没有反应?
- google-apps-script - 从子文件夹(在 Google Drive 上)获取特定文件(Google Sheet),然后更改单元格的值
- postgresql - 是否可以在“创建物化视图为”形式的物化视图上创建新索引?
- reactjs - 迭代和 Typescript 优化
- c# - .NET 是在新的不同线程池线程上恢复等待继续,还是重用以前恢复的线程?
- ios - SwiftUI 访问在 ForEach 循环中创建的视图
- android - 在 MAC Catalina 中更新 SDK 管理器时 Flutter 安装出错
- angular - 无法为“text/html”的范围错误内容类型注册/更新 ServiceWorker