什么是左值?

时间:2011-06-18 17:40:48

标签: c++

  

可能重复:
  What are rvalues, lvalues, xvalues, glvalues, and prvalues?

C ++标准,主要在第5章,标题为表达式,定义哪些表达式是左值,哪些是右值。我读过那一章,我相信我可以正确区分左值和右值。

然而,在我阅读好的C ++书籍和/或标准之前,我曾经认为左值是可以站在赋值左侧的东西,右值是不能的。显然,这个天真的定义有很多反例。一段时间后,我认为左值是一个有地址的东西,右值是没有的东西。这也似乎有一些反例,例如,一些临时物体,显然,它们确实有一个地址。

我的一个朋友问我什么是左值,什么是左值。我告诉他大概是什么,他要求一个更完整的答案。我告诉他去读标准。他拒绝骚扰他的大脑,并表示他确信必须有一些必要和充分的条件才能成为一个左右。

有吗?

例如,左值是非const引用可以绑定的值。但这个并不令人满意。我正在寻找一些更明显的东西,这些东西很容易解释,而不需要考虑每种表达类型......

我希望这个问题很明确。

4 个答案:

答案 0 :(得分:10)

非常简单,rvalue是表达式结果无法在所述表达式结束后存活的时间。左值将。这个基本原则是移动语义和右值引用的原因 - 您可以毫无问题地修改它们,因为您知道对象的生命已经结束。

答案 1 :(得分:8)

我发现将左值作为“有名字的东西”是最有用的简化。表达式++x是左值,名称为x。相比之下,rvalue是“没有名字的东西”。 x++是一个右值,因为它会产生一些未命名的值。

答案 2 :(得分:0)

可能你只是在可修改的左值和非左值之间有点混淆。 rvalues可以是左值或非左值。在引入const修饰符后使用术语可修改的左值(参见wikipedia entry on values) 在C ++中,每个表达式都返回一个左值,右值或无值。当左值显示为右值时,它会被隐式转换为右值(参见IBM on value types

答案 3 :(得分:-1)

l值是指内存位置。这是我能说的最简单的事情。一个r值可以是一个l值 r值只是表达式或常量

的结果