请考虑以下功能。我想要C ++ 17的答案。
MyClass&& func() {
return MyClass{};
}
int main() {
MyClass&& myRef = func();
}
问题:
func()
是一个xvalue吗?为什么?myRef
是悬挂的参考?或者,更具体地说,为什么func()
返回一个悬空参考?返回右值引用是否会导致临时实现,并延长临时对象的生存期?func()
是xvalue,因为该语言的规则之一是,如果声明一个函数具有对对象的rvalue引用的返回类型,则由调用该函数组成的表达式就是xvalue。 (C ++ 17 expr.call/11)。
Temporary materialization会在引用绑定到prvalue时发生。
该函数的结果是myRef
,它由prvalue func()
初始化。但是,如果我们在class.temporary / 6中查询生命周期扩展规则,则它具有:
在函数return语句中,临时绑定到返回值的生存期不会延长;临时在return语句中的全表达式结束时销毁。
因此,当func()
语句完成且没有扩展名时,由return
实现的临时对象将被销毁。