从函数返回一个布尔文字作为参考

Returning a boolean literal from function as reference

我在查找错误时遇到了这段代码:

int x = 10; // for example

const bool& foo() {
    return x == 10;
}

int bar() {
    bool y = foo(); // error here
}

此代码块在使用 gcc11.2 编译时会导致崩溃,但在 Visual Studio 2019 中它可以正常工作并将 y 设置为 true。两个编译器都会发出有关返回对局部变量的引用的警告。我想知道这种行为是否是 UB。 (我们通过将 bool& 更改为 bool 来修复此错误)

编辑:我忘了把 const 放在 bool& 之前,很抱歉。

这是未定义的行为,因为您正试图 return 对一个值的引用,一旦您退出该函数,其范围就会被销毁。

您是否尝试过更改编译器版本? 该代码甚至不应该编译,因为它将引用绑定到一个临时值。低于 g++ 7.5 的输出 g++ 7.5.0

error: cannot bind non-const lvalue reference of type ‘bool&’ to an rvalue of type ‘bool’

非 const 引用不与临时值绑定。 临时引用可以绕过编译问题

const bool& foo() {
    return x == 10;
}

但未定义的行为将保留,因为它链接到一个临时值。

**** 更新 正如我所建议的那样,我报告答案提到了一个初始问题,其中通过引用返回的函数 foo () 不是 const 现在,该问题已被编辑以合并此问题。感谢 Yunnosch 的建议

x == 10 是右值而不是左值,它没有地址,您可以引用它。如果它在 VS 2019 下工作,则意味着编译器必须优化代码并内联函数或类似的东西。在调试模式下它不应该工作。