虽然这可能是一个简单的问题,但我无法找到答案,可能是因为这些情况在您的标准按值传递和按引用传递教程中没有涵盖。 我熟悉这两个原则,但我无法准确指出编译器在以下两种情况下的作用。 我正在寻找有关堆栈上发生的情况以及编译器何时创建对象副本而不是简单地分配地址的解释。
请考虑以下函数:
int & foo();
当a
不是按引用时会发生什么?
int a = foo(); // a is not int &
考虑下一个函数:
int bar();
当b
是按引用时会发生什么?
int & b = bar(); // bar is not by-reference
foo()
和 bar()
的值都是 int
类型的值。前者是右值,后者是右值。当你说int a = foo();
或int a = bar()
时,局部对象变量a
是用该值初始化的。当你说int & b = foo()
时,局部引用变量b
绑定到右侧的值(这是一个左值)。语句int & b = bar()
无效,因为引用无法绑定到右值。
在第一种情况下,只需从函数返回的引用引用的当前包含的对象中复制值。
第二种情况对于非常量引用是非法的,在常量引用的情况下,函数返回的引用对象将保持活动状态,直到引用超出范围(C++语言中对此有非常具体的规则)。
在第一种情况下,引用绑定到的对象(即由返回的值表示的对象)被复制到a
中。不会引入临时来保存返回值。
在第二种情况下,它不会编译,因为bar()
是一个右值。