返回const lvalue引用rvalue临时?为什么这项工作

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

本文关键字:为什么 工作 临时 const lvalue 引用 rvalue 返回      更新时间:2023-10-16

为什么此代码工作?它每次都打印出60。首先,const thingy&表示该函数返回对已经存在的变量,而不是无名结构的引用。其次,当功能返回时,那个临时的死亡是否应该不应该创建null引用吗?我正在使用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;
}

您的两个选项都不是按C 标准工作的所需的,因此不应假定在任何特定情况下都一定会起作用。

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

理想情况下,您将按值(thingy getThingy();)返回以确保兼容性。任何值得您时间的编译器仍将对此应用回报值优化,从而阻止了复制构造函数调用的需求并仍允许必要的效率。

编译器在此处执行返回值优化。

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

编译器能够在申报表中构建的值,甚至不需要复制它。但是,在您在函数内部构造结构的示例中,它确实是局部变量,因此在函数结束时掉落了范围,使参考文献无效。

我们不应混合rvalue和lvalue参考。最好的选择是通过复制返回。

返回局部变量的薰衣草恢复将始终导致问题。