返回对局部变量的引用而不进行简单的转换

Son*_*nar 2 c++ g++ reference

我是C++编程的新手,但这个问题一直在旋转.我知道在函数中返回对局部变量的引用是非法的,即编译此代码片段:

inline int& funref() {
    int    a = 8;
    return a;     // not OK!
}
Run Code Online (Sandbox Code Playgroud)

导致编译器发出警告,然后发生运行时错误.但是,为什么这段代码在没有任何警告的情况下编译并运行没有错误?

inline int& funref() {
    int  a    = 8;
    int& refa = a;
    return refa;   // OK!
}

int main() {
    int& refa = funref();
    cout << refa;
}
Run Code Online (Sandbox Code Playgroud)

我的编译器是Linux Fedora平台上的g ++.

Use*_*ess 5

它仍然是错的,它恰好是通过(非)快乐的巧合来工作的.

这段代码具有未定义的行为以及所有常见的警告(它可能始终有效,它可能一直有效,直到修复为时已晚,它可能会引发你的房子并与你的未婚妻一起逃跑).

编译器不需要为每个可能的错误发出诊断(警告或错误消息),因为并不总是这样做.在这里,至少你当前版本的g ++没有警告过.不同的编译器,或不同版本的g ++,甚至是具有不同标志的相同版本,都可能会警告您.