将const左值引用返回到rvalue临时值?为什么这样做?

时间:2016-06-17 02:55:27

标签: c++ reference lvalue rvalue

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

#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;
}

3 个答案:

答案 0 :(得分:2)

您的两个选项都不是必需的来使用C ++标准,因此不应假设它们在任何特定情况下都必须有效。

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

理想情况下,您将按值(thingy getThingy();)返回,以确保兼容性。任何值得花时间的编译器仍然会对此进行返回值优化,从而无需复制构造函数调用,仍然可以保持必要的效率。

答案 1 :(得分:1)

编译器在这里执行返回值优化。

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

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

答案 2 :(得分:-1)

我们不应该混合rvalue和左值引用。 最好的选择是通过复制返回..

返回局部变量的lavalue rerense总会导致问题。