C++ 将非引用变量赋值给通过引用返回的函数,反之亦然

C++ 将非引用变量赋值给通过引用返回的函数,反之亦然,c++,stack,C++,Stack,虽然这可能是一个简单的问题,但我无法找到答案,可能是因为您的标准传递值和传递参考教程中没有涵盖这些情况。我对这两种原理都很熟悉,但我无法准确指出编译器在以下两种情况下的具体操作。我正在寻找一个解释,说明当编译器复制对象而不是简单地分配地址时,堆栈上会发生什么 考虑以下功能: int & foo(); int bar(); 当a不是通过引用时会发生什么 int a = foo(); // a is not int & int & b = bar(); // bar i

虽然这可能是一个简单的问题,但我无法找到答案,可能是因为您的标准传递值和传递参考教程中没有涵盖这些情况。我对这两种原理都很熟悉,但我无法准确指出编译器在以下两种情况下的具体操作。我正在寻找一个解释,说明当编译器复制对象而不是简单地分配地址时,堆栈上会发生什么

考虑以下功能:

int & foo();
int bar();
a
不是通过引用时会发生什么

int a = foo(); // a is not int &
int & b = bar(); // bar is not by-reference
考虑下一个函数:

int & foo();
int bar();
b
通过引用时会发生什么

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

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


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

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

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


第二种情况是非法的,具有非const引用,在const引用的情况下,相反,引用返回的函数对象将保持生存,直到引用超出范围(在C++语言中有一个非常具体的规则)。事实并非如此。对函数调用表达式求值,然后求值生成一个值。值始终是一个对象。我编辑了这个问题,因为在第二个示例中明显存在输入错误(现在调用

bar()
,而不是
foo()