为什么这段代码有效?它每次打印出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;
}
答案 0 :(得分:2)
您的两个选项都不是必需的来使用C ++标准,因此不应假设它们在任何特定情况下都必须有效。
编译器细节导致第一个选项在您直接返回值的地方工作。
理想情况下,您将按值(thingy getThingy();
)返回,以确保兼容性。任何值得花时间的编译器仍然会对此进行返回值优化,从而无需复制构造函数调用,仍然可以保持必要的效率。
答案 1 :(得分:1)
编译器在这里执行返回值优化。
https://en.wikipedia.org/wiki/Return_value_optimization
编译器能够获取返回时构造的值,甚至不需要复制它。但是,在构造函数内部结构的示例中,它实际上是一个局部变量,因此在函数末尾超出范围,使引用无效。
答案 2 :(得分:-1)
我们不应该混合rvalue和左值引用。 最好的选择是通过复制返回..
返回局部变量的lavalue rerense总会导致问题。