9

在以下情况下应该发生什么:

int functionA() {
    return 25;
}

void functionB(const int& ref) {
    cout << ref << endl;
}

void start() {
    functionB(functionA());
}

编译此示例时,它输出正确的值 25。这是如何工作的?仅使用对堆栈的引用时,是否应该删除(从堆栈中删除)堆栈上的引用返回值,或者行为未定义?

4

2 回答 2

10

这个“有效”是因为const int& ref- 当引用是const(保证您不想更改它)时,编译器将在调用代码中生成一个临时对象(start在您的情况下),然后将引用传递给它。

如果删除const它将无法编译,因为functionA' 的结果无法转换为参考。

于 2013-09-16T14:37:17.350 回答
9

没有“堆栈上的返回值”(更不用说“堆栈”):functionA返回一个int by value,因此表达式functionA()只是 type 的临时值int。该值绑定到 中的常量引用functionB,并且由于它的生命周期是完整表达式的生命周期,所以一切都很好。

于 2013-09-16T14:37:35.263 回答