【发布时间】:2017-09-07 01:40:29
【问题描述】:
对于从函数返回并绑定到右值/常量左值引用的对象的生命周期延长,我有一些不清楚的信息。来自here的信息。
在 return 语句中临时绑定到函数的返回值不会被扩展:它在 return 表达式的末尾立即被销毁。这样的函数总是返回一个悬空引用。
如果我理解正确,引用声称 return 语句返回的对象的生命周期是不可扩展的。但最后一句话表明,这只适用于返回引用的函数。
在 GCC 上,此代码产生以下输出:
struct Test
{
Test() { std::cout << "creation\n"; }
~Test() { std::cout << "destruction\n"; }
};
Test f()
{
return Test{};
}
int main()
{
std::cout << "before f call\n";
Test && t = f();
std::cout << "after f call\n";
}
before f call
creation
after f call
destruction
所以看起来寿命延长了。
绑定到此类引用的临时对象的生命周期是否应该延长?另外能否提供更明确的信息来源?
【问题讨论】:
-
是的,应该,但我不知道它是否在标准中指定。
-
Test && t = f();- 该代码没有意义。为什么将对象声明为右值? -
@Criss 抱歉,删除了评论,因为我忽略了
&&这可能会导致我不熟悉的东西。但是,我不太明白这个问题,因为您的f没有返回参考,而是本地临时的副本,所以一切都应该没问题 -
@jaskmar 这不是一个右值,它是一个右值引用——这是两个不同的东西。右值是一个值类别,右值引用是一个类型
-
hm...也许返回的临时文件的生命周期应该在行尾结束,但是我仍然没有看到引用的相关性,因为它是关于从一个函数。我的猜测是,RVO 是您看不到
destruction临时内部f的原因
标签: c++ reference language-lawyer lifetime temporary