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