为什么返回的对象是右值

Why is returned object an rvalue?

本文关键字:对象 返回 为什么      更新时间:2023-10-16
class A {}
A foo() {
  A a;
  // some work
  return a;
}

这里它返回一个A的实例,我看到很多读数说这返回了一个rvalue

我的困惑是,由于做A b; a = b;是完全合法的,变量a似乎是一个lvalue。那么,为什么当它是返回的时,它会变得rvalue呢?

没有右值对象这样的东西。

右值和左值是指表达式

一个引用对象的表达式可以是

右值,而另一个引用同一对象的表达式可以是左值。


最初"左值"是指任何可以在C =左侧的表达式,而"右值"是任何只能在右侧的表达式。从那以后,C++获得了const和参考资料,事情变得复杂了。但是早期的C观点对于理解这一点是有用的。


关于。。。

"> 变量a似乎是一个左值。那么,为什么当它是返回的时,它会变成右值呢?

好吧,变量本身不是一个左值。表达式a是一个左值。并且该函数不返回变量:它返回变量的值。

因此,据我了解,这个问题涉及两个误解:

  • 左值/右值是关于对象的想法。这是关于表达的。

  • A foo() { return... }返回对对象的引用的想法(例如在Java中(。它返回一个值。

lvalue是一个引用内存位置的表达式,并允许我们通过 & 运算符获取该内存位置的地址。rvalue是不是lvalue的表达式。

看这里 http://thbecker.net/articles/rvalue_references/section_01.html

在您的示例中,您将返回堆栈分配实例的副本。但这也可能在堆栈上,并且是"临时副本",因此您无法获取它的地址。因此它不是一个lvalue,所以它是一个rvalue