【发布时间】: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++ 编译器。