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