为啥 c++ 编译器不会警告返回对局部变量的引用?
Posted
技术标签:
【中文标题】为啥 c++ 编译器不会警告返回对局部变量的引用?【英文标题】:Why does c++ compiler not warn about returning reference to local variable?为什么 c++ 编译器不会警告返回对局部变量的引用? 【发布时间】:2019-03-23 14:32:43 【问题描述】:在下面的代码中,编译器会在调用 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
【问题讨论】:
如果您麻烦地设置自己的参考,它需要给您怀疑的好处。我认为你对编译器的要求太多了。 :) 从技术上讲,该标准在任何一种情况下都不需要警告。你很幸运,你的编译器在其中一个中给出了警告。它在bar()
中发出警告的原因是因为参与开发编译器的某人(或某些人)竭尽全力让它这样做。它没有在foo()
中发出警告的原因是因为还没有人竭尽全力让编译器发出警告。为什么有区别?因为编译器开发人员并不比其他人更完美。
What compiler? 不需要诊断任何一个错误。如果您认为应该修复编译器中的这个 QoA 问题,请提交错误。
@n.m.它是 g++ 编译器。
【参考方案1】:
“为什么 c++ 编译器不警告返回对局部变量的引用?”
因为编译器并不完美,最终您有责任不编写无效代码。编译器没有义务警告所有错误(事实上,它有义务警告非常少,但大多数尝试做得比最低要求更好)。
【讨论】:
事实上,警告是“乐观的”,以避免误报,与代码检查/静态代码分析器完全相反。以上是关于为啥 c++ 编译器不会警告返回对局部变量的引用?的主要内容,如果未能解决你的问题,请参考以下文章