标准的第12.2.5节规定:
函数调用中引用参数的临时绑定(5.2.2)持续到包含该调用的完整表达式完成为止。函数返回语句中返回值的临时绑定(6.6.3)持续到函数退出为止。在所有这些情况下,在初始化引用的表达式求值期间创建的临时值(除了与引用绑定的那个临时值)将在创建它们的完整表达式结束时以相反的顺序销毁。
我正在尝试理解以下代码:
#include <iostream>
const int& foo(const int& fooRef)
{
return fooRef;
} // #0
int main (void)
{
const int& numberRef = foo(5); // #1
std::cout << numberRef; // #2
return 0;
}
在代码的第一行创建了一个临时对象并将其绑定到fooRef
上,fooRef
在代码的第0行被销毁。但由于生命周期延长不是可传递的,所以我认为这里应该销毁临时对象。
问题:
直到函数退出
是什么意思?它是否意味着直到执行完成
?为什么程序输出
5
?在第#2
行,临时对象还存在吗?我该如何解释标准引用以弄清楚这个例子的工作原理?
请提供逐步详细的解释,并引用与标准相关的内容。谢谢!
P.S. 一个已接受的答案here也说明这段代码是有问题的,但我不明白为什么会得到这样的程序输出。
5
。当我使用-O2
标志进行编译时,实际上输出为0
。添加选项-Wall
会警告使用未初始化的值。相反,使用clang++始终会打印5
且没有警告消息,不受使用的编译器选项的影响。但不要依赖于这种行为! - Kai Petzke