Kol*_*nya 9 c++ reference object-reference lifetime temporary-objects
标准的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;
}
Run Code Online (Sandbox Code Playgroud)
在线#1创建临时对象并绑定到fooRef参数foo.fooRef在线销毁#0.所以我认为临时应该在这里销毁,因为生命延长不是传递性的.
问题:
什么until the function exits意思?这是untill it finished executing什么意思?
为什么我得到一个5输出.临时对象是否仍然存在#2?
如何解释标准引用以弄清楚此示例的工作原理?
将非常感谢参考标准的逐步原子演练.谢谢!
PS 这里接受的答案也告诉代码是broken,我没有得到,为什么我得到这样的程序输出.
And*_*owl 10
函数退出之前是什么意思?这是否意味着直到它完成执行?
是的。
为什么我得到 5 输出。第 2 行是否仍然存在临时对象?
取消引用未绑定到活对象的引用是未定义的行为,因此您可能会得到5与42其他任何事情一样好的结果(包括崩溃)。您不能对具有未定义行为的程序抱有任何期望。
我如何解释标准报价以弄清楚这个例子是如何工作的?
就像你已经做的一样。临时被绑定到函数参数fooRef,当从函数返回时它会被破坏。由于该临时对象绑定到返回值,因此该对象在函数返回时不再存在。稍后,您将取消对悬空引用的引用,从而为您提供 UB。
| 归档时间: |
|
| 查看次数: |
4605 次 |
| 最近记录: |