【发布时间】:2020-09-20 08:31:13
【问题描述】:
我试图更好地了解如何将左值和右值作为引用处理,因此我创建了这个玩具示例:
#include <iostream>
struct Val
{
Val(int num) : num(num){};
~Val()
{
std::cout << "Destructing with value " << num << std::endl;
}
int num;
};
const Val &test(const Val &val)
{
return val;
}
int main()
{
std::cout<< "Creating foo with value 5" <<std::endl;
const Val &foo = test(Val(5));
std::cout<< "Creating bar with value 3" <<std::endl;
const Val &bar(3);
std::cout<< "Finishing main function" <<std::endl;
return 0;
}
打印出来:
Creating foo with value 5
Destructing with value 5
Creating bar with value 3
Finishing main function
Destructing with value 3
基本上我们看到这个右值Val(5) 绑定到函数val 中的常量引用参数test,并且返回了相同的值——但是,析构函数被立即调用,因为它是一个临时的。但是当我们尝试构造 Val(3) 并分配给一个 const 引用时,它仍然在整个块的范围内。
我的想法是,我们可以将右值绑定到 const 引用,这将延长它们的生命周期,直到该引用超出范围,但这里似乎不一定如此。如果能深入了解我的误解,我将不胜感激。
【问题讨论】:
标签: c++ reference lifetime temporary