将by-reference变量分配给通过引用返回的函数,反之亦然

时间:2014-03-04 21:53:41

标签: c++ stack

虽然这可能是一个简单的问题,但我无法找到答案,因为这些情况不在您的标准值传递和传递参考教程中。我熟悉这两个原则,但我无法确切地指出编译器在以下两种情况下的作用。我正在寻找关于在堆栈上会发生什么的解释以及 时编译器制作任何对象副本而不是简单地分配地址。

考虑以下功能:

int & foo();

a不是引用时会发生什么?

int a = foo(); // a is not int &

考虑下一个功能:

int bar();

b是引用时会发生什么?

int & b = bar(); // bar is not by-reference

3 个答案:

答案 0 :(得分:1)

表达式foo()bar()的值都是int类型的值。前者是左值,后者是左值。当您说int a = foo();int a = bar()时,使用该值初始化本地对象变量a。当您说int & b = foo()时,本地引用变量b绑定到右侧的值(这是一个左值)。语句int & b = bar()无效,因为引用无法绑定到rvalues。

答案 1 :(得分:1)

在第一种情况下,只是从函数返回的引用所引用的对象中当前包含的值复制该值。

第二种情况对于非const引用是非法的,如果是const引用,则函数返回的引用对象将保持活动状态,直到引用超出范围(对此有一个非常具体的规则) C ++语言)。

答案 2 :(得分:0)

在第一种情况下,引用绑定的对象(,由返回值表示的对象)被复制到a。没有引入临时值来保存返回值。

在第二种情况下,它不会编译,因为bar()是一个右值。