为什么此代码有效?每次打印60。首先,const thingy&表示该函数返回对已经存在的变量的引用,而不是无名的构造。其次,当函数返回并创建空引用时,该临时函数是否不应该死亡?我正在使用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;
}

最佳答案

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

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

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

09-25 20:19