返回对右值临时的 const 左值引用?为什么这行得通?

Returning const lvalue reference to rvalue temporary? Why does this work?

为什么这段代码有效?它每次都打印出 60。首先,const thingy& 表明函数 returns 是对已经存在的变量的引用,而不是无名构造。其次,当函数 returns 时,那个临时值不应该死掉,从而创建一个空引用吗?我正在使用 OSX 上的任何最新 GCC 版本...有人可以向我解释为什么这有效吗?

#include <iostream>

using namespace std;

struct thingy {
    double things;
    double moreThings;
    double evenMoreThings;
};

const thingy& getThingy() {
    return {60, 60, 60};
}

int main() {
    cout << getThingy().evenMoreThings << endl;
}

如果这行得通,那为什么不行呢?

const thingy& getThingy() {
    thingy t{60, 60, 60};
    return t;
}

编译器正在此处执行 Return 值优化。

https://en.wikipedia.org/wiki/Return_value_optimization

编译器能够获取在 return 处构造的值,甚至不需要复制它。但是,在您在函数内部构造结构的示例中,它实际上是一个局部变量,因此在函数末尾超出范围,使引用无效。

根据 C++ 标准, 都不需要两个选项,因此不应假设任何一个在任何特定情况下都必须工作。

编译器细节导致第一个选项在您直接 return 值的地方工作。

理想情况下,您应该按值 return (thingy getThingy();) 来确保兼容性。任何值得您花时间的编译器仍将对此应用 return 值优化,从而避免调用复制构造函数并仍然允许必要的效率。

我们不应该混合使用右值和左值引用。 最好的选择是return复制..

返回局部变量的lavalue rerense总是会出问题。