【发布时间】:2013-06-28 10:31:19
【问题描述】:
标准的第 12.2.5 节说:
在函数调用中临时绑定到引用参数 (5.2.2) 一直持续到包含 称呼。临时绑定到函数 return 中的返回值 语句 (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;
}
在线#1 创建一个临时对象并绑定到fooRef。 fooRef 在#0 线上被销毁。我认为应该在这里销毁临时对象,因为生命周期扩展不是传递的。
问题:
-
until the function exits是什么意思?是untill it finished executing的意思吗? -
为什么我得到一个
5输出。#2线上是否还存在临时对象? -
如何解释标准引用以了解此示例的工作原理?
非常感谢参考标准的逐步原子演练。谢谢!
P。 S. 一个接受的答案here 还告诉代码是broken 我不明白,为什么我会得到这样的程序输出。
【问题讨论】:
-
当我用 G++ 9.3.0 编译你的代码时,我得到了输出
5。当我使用-O2标志编译它时,我实际上得到了输出0。添加选项-Wall会警告使用未初始化的值。相反,使用 clang++ 总是会打印5并且没有警告消息,与使用的编译器选项无关。但不要依赖这种行为!
标签: c++ reference lifetime object-reference temporary-objects