临时寿命延长
标准的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;
}
在#1
行创建一个临时对象并绑定到foo
fooRef
参数。 #0
行销毁fooRef
。 所以我认为临时应该在这里销毁,因为终身延长不是传递性的。
问题:
until the function exits
意味着什么? 这是否意味着untill it finished executing
?
为什么我会得到5
输出。 #2
行是否还存在临时对象?
我如何解释标准报价以找出这个例子的工作原理?
我们将非常感谢参考标准的逐步原子漫步。 谢谢!
PS这里接受的答案也告诉代码被broken
,我不明白为什么我会得到这样的程序输出。
直到功能退出意味着什么? 这是否意味着它完成执行?
是。
为什么我会得到5个输出。 第2行是否还存在临时对象?
取消引用不受限于活动对象的引用是未定义的行为 ,因此您可能会得到5
以及42
以及其他任何内容(包括崩溃)。 对于未定义行为的程序,您根本无法预料。
我如何解释标准报价以找出这个例子的工作原理?
几乎和你一样。临时被绑定到函数参数fooRef
,当从函数返回时它被破坏。 由于该临时值绑定到返回值,因此该函数返回时,该对象将不再存在。 稍后,您将取消引用一个悬空引用,这会为您提供UB。
它意味着直到右大括号,即}
。
你援引UB,你有一个悬而未决的参考。
尝试对代码进行以下修改并查看它打印的内容。 它可能会打印6
因为这是堆栈中的最后一个。 或者尝试传递一个std::string
来代替,你可能会崩溃。
int main (void)
{
const int& numberRef = foo(5);
foo(6);
std::cout << numberRef;
return 0;
}
链接地址: http://www.djcxy.com/p/72273.html