class A {}
A foo() {
A a;
// some work
return a;
}
这里它返回A
的实例,我看到很多读数都说这会返回rvalue
。
我的困惑是,因为A b; a = b;
完全合法,变量a
似乎是lvalue
。那么为什么它会在归来的时候成为rvalue
?
答案 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