在以下情况下会发生什么:
int functionA() {
return 25;
}
void functionB(const int& ref) {
cout << ref << endl;
}
void start() {
functionB(functionA());
}
编译此示例时,它会输出正确的值25.这是如何工作的?当仅使用对它的引用时,不应该删除堆栈上引用的返回值(从堆栈中删除),还是行为未定义?
答案 0 :(得分:9)
由于const int& ref
这个“有效” - 当引用为const
时(保证您不想更改它),编译器将在调用代码中生成一个临时对象({ {1}}在你的情况下),然后将引用传递给它。
如果删除start
,则无法编译,因为const
的结果无法转换为引用。
答案 1 :(得分:8)
堆栈上没有“返回值”(更不用说“堆栈”):functionA
按值返回int
,因此表达式{{1 }}只是类型functionA()
的临时值。这个值绑定到int
中的常量引用,并且因为它的生命周期是完整表达式的一生,所以一切都很好。