为什么此代码有效?每次打印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的示例中,它实际上是一个局部变量,因此在函数末尾超出范围,使引用无效。