为啥 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++ 编译器不会警告返回对局部变量的引用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 编译器不优化对结构数据成员的读写而不是不同的局部变量?

为啥这段代码会给出“可能的空引用返回”编译器警告?

C++基础问题 需返回局部对象的引用时的处理

Clang 没有报告 C++ 中未初始化的变量?

摆脱“引用自由变量”字节编译警告

C++“警告:返回对临时的引用”——但事实并非如此