2017-02-26 19 views
1

我读过很多关于const引用的文章,但还没有找到我要找的内容。 您能否纠正我关于将临时变量绑定到const引用的机制的假设,以便延长生命期?const引用临时变量和后面的机制

int Foo(){return 3;} 

int main(){ 
const int& ref = Foo(); 
return 0; 
} 

Foo返回位于一个寄存器和通常事后驳回的临时未命名值。将它绑定到const引用会告诉编译器不要关闭它,而是将该值保存在内存中,范围为ref,别名为ref

这是如何工作的?

+0

所有关于寄存器和“内存”的讨论都是现代时代的过度简化,尤其是在讨论通常使用强大优化编译的C++等语言时。只是因为你在源头上看到了某些东西,并不意味着甚至需要甚至存在,或者存在于你可能期望的地方。例如,你编译的代码等同于'int main(){return 0;}'。 '3'永远不会存储在任何地方。 –

回答

0

该语言并没有真正说明这是如何实现的,它应该如何工作,而是展示了一种可能的方式。

从理论上讲,没有什么能够阻止编译器将临时文件保存在寄存器中,并使用ref作为它的名称。所以不得不存储在内存中的值。

或者,在这种特殊情况下,编译器可以看到该值始终为3,因此它可以代替ref的所有用途,并且不会在任何地方存储任何内容。

1

富返回临时无名值

正确的。

位于在寄存器

由标准未指定。

和常事后

在充分表达的端部销毁驳回,更精确。如果生命期没有被参考文献扩展。

当然,整数没有析构函数,所以生命期只是表示存储(如果有)是否可以重用。

绑定它const引用告诉编译器不将其关闭,但在内存中具有Ref

正确的范围保存该值。将引用绑定到临时对象将延长该临时对象的生存期以匹配引用的生存期。