为什么返回的对象是右值?

时间:2015-10-28 22:24:02

标签: c++ lvalue rvalue

class A {}

A foo() {
  A a;
  // some work
  return a;
}

这里它返回A的实例,我看到很多读数都说这会返回rvalue

我的困惑是,因为A b; a = b;完全合法,变量a似乎是lvalue。那么为什么它会在归来的时候成为rvalue

2 个答案:

答案 0 :(得分:4)

没有rvalue 对象

Rvalue和左值是指表达式

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

最初“左值”是指可能位于C =左侧的任何表达式,而“rvalue”是任何只能位于右侧的表达式。从那以后,C ++已经获得了const和引用,事情变得复杂了。但是早期的C观点对于理解这一点很有用。

关于......

  

变量a似乎是一个左值。那么为什么它会在返回时变成右值?

嗯,变量本身不是左值。表达式a是左值。函数不返回变量:它返回变量的

所以,据我所知,这个问题涉及两个误解:

  • lvalue / rvalue是关于对象的想法。这是关于表达的。

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

答案 1 :(得分:0)

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

请参阅此处http://thbecker.net/articles/rvalue_references/section_01.html

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