关于c ++:什么是左值?


What is an lvalue?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What are rvalues, lvalues, xvalues, glvalues, and prvalues?

C++标准,主要在第5章中,命名为表达式,定义哪些表达式是LValk,哪些是RValk。我读过那一章,我相信我能正确区分lvalues和rvalues。

然而,在我读了好的C++书籍和/或标准之前,我曾经认为LValk是一种可以站在赋值左侧的东西,而rValk是不能用的东西。显然,对于这种幼稚的定义,有许多反例。过了一段时间,我认为左值是有地址的,右值是没有地址的,这也有一些反例,比如说,一些临时对象,很明显,这些对象确实有地址。

我的一个朋友问我什么是左值,什么是右值。我大致告诉他这是什么,他要求一个更完整的答案。我叫他去读标准。他拒绝骚扰自己的大脑,并说他确信一定有一些必要和充分的条件使某些东西成为左值。

有?

例如,左值是非常量引用可以绑定到的值。但这一次并不令人满意。我在寻找一些更明显的东西,一些易于解释的东西,而不必考虑每种表达类型…

我希望问题很清楚。


很简单,一个右值是当表达式结果不能在所述表达式结束后继续存在。左值遗嘱。这个基本原则是支持移动语义和右值引用的——您可以毫无问题地修改它们,因为您知道对象的生命已经结束。


我发现把lvalues看作是"有名字的东西"是最有用的简化方法。表达式++x是一个左值,名称为x。相比之下,rvalue是"没有名字的事物"。x++是一个右值,因为它产生一些未命名的值。


可能你只是对可修改的左值和非左值有点困惑。rvalues可以是lvalues或non-lvalues。术语modifiable lvalue在引入const修饰符后使用(参见wikipedia的values条目)。在C++中,每个表达式返回一个左值、rValor或无值。当一个LValk作为一个R值出现时,它隐式地转换成一个R值(参见值类型上的IBM)。


L值是指内存位置。这是我能说的最简单的事情。R值可以是L值。R值只是表达式或常量的结果