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