虽然这可能是一个简单的问题,但我无法找到答案,因为这些情况不在您的标准值传递和传递参考教程中。我熟悉这两个原则,但我无法确切地指出编译器在以下两种情况下的作用。我正在寻找关于在堆栈上会发生什么的解释以及 时编译器制作任何对象副本而不是简单地分配地址。
考虑以下功能:
int & foo();
当a
不是引用时会发生什么?
int a = foo(); // a is not int &
考虑下一个功能:
int bar();
当b
是引用时会发生什么?
int & b = bar(); // bar is not by-reference
答案 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()
是一个右值。