将函数的返回值作为引用传递

10
以下案例应该发生什么:
int functionA() {
    return 25;
}

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

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

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

2
请参阅C++11标准12.2/4,5,了解常量引用对临时对象的影响。 - nikolas
2个回答

10
这里之所以“有效”,是因为使用了“const int& ref”- 当一个引用是“const”(保证你不想修改它)时,编译器会在调用代码中(在您的情况下是“start”)产生一个临时对象,然后将该引用传递给它。
如果您去除"const",它将无法编译,因为“functionA”的结果不能转换为引用。

编译器也可以为非const引用生成临时对象。此外,在糟糕的代码中,没有严格的保证const对象不会被更改。我认为这更像是一种意识形态限制(以及“const”范例)。 - matreshkin
@matreshkin:编译器无法将临时对象传递给非const引用。如果您在调用的函数中使用const-cast或类似方法进行更改,则可以更改该对象。但是,编译器不允许非const引用成为临时对象,这是这个问题的关键。如果您有一个非const引用,则编译器需要在调用后保留某些内容,因为它期望您想要更改它,并查看更改后的值 - 如果您想要那样,那么在调用结束时消失的临时对象是无用的。 - Mats Petersson

9

栈上没有“返回值”(更不用说“堆栈”):functionA通过值返回一个int,因此表达式functionA()只是int类型的临时值。这个值绑定到functionB中的常量引用上,由于它的生命周期与整个表达式相同,所以一切都很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接