【问题标题】:What is an lvalue? [duplicate]什么是左值? [复制]
【发布时间】:2011-09-17 20:55:07
【问题描述】:

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

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

然而,在我阅读好的 C++ 书籍和/或标准之前,我曾经认为左值可以位于赋值的左侧,而右值则不能。显然,这个幼稚的定义有许多反例。一段时间后,我认为左值是有地址的东西,而右值是没有地址的东西。这似乎也有一些临时对象形式的反例,这些临时对象显然确实有一个地址。

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

有吗?

例如,左值是非常量引用可以绑定到的东西。但是这个真的不能令人满意。我正在寻找更明显的东西,易于解释的东西,而无需考虑每种表达式类型......

我希望问题很清楚。

【问题讨论】:

标签: c++


【解决方案1】:

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

【讨论】:

  • "r-value 可以是 l-value" 否;表达式是右值或左值(在 C++98 中);左值可以隐式转换为右值。
【解决方案2】:

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

【讨论】:

  • 不,我不认为我对这些概念感到困惑
  • 展示不可修改的左值不需要 const 限定符:int x[3]; 这里,x 是不可修改的左值。 “右值可以是左值或非左值”这是不正确的:没有右值是左值。每个表达式都是要么左值或右值。有一个隐式转换允许将左值转换为右值。
【解决方案3】:

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

【讨论】:

  • +1 用于实际阅读和理解我的问题。但是 int& f() {int* p = new int; return *p;} f() 的名称是什么? :)
  • @Armen: 0x830D2CFF,或任何地址 new int 碰巧产生。我从来没有说过你需要访问这个名字:-P
  • @Dennis:在这种情况下,我们不能将临时对象视为具有名称(因为它具有地址)的对象吗?
  • stackoverflow.com/questions/6162226/what-rvalues-have-names(右值可以有名字(很多有),而左值可以没有名字(很多没有名字)。
  • @Dennis, f() 是右值,但不是临时值。事实上,可以说每个临时地址都有一个地址。每个临时对象都是一个对象,一个对象是一个存储区域。但是在 C++ 中仍然没有有名字的临时对象(但不是每个无名对象都是临时对象!)。
【解决方案4】:

很简单,右值是当表达式结果不会超过所述表达式的结尾时。一个左值将。这个基本原则是启用移动语义和右值引用的原因——您可以毫无问题地修改它们,因为您知道对象的生命已经结束。

【讨论】:

  • 这不是真的 - 你可以有一个左值来指定一个临时对象,以及一个右值来指定一个静态存储持续时间的对象,(以及其他可能性)
猜你喜欢
  • 2020-01-03
  • 1970-01-01
  • 2020-07-11
  • 2019-02-09
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
相关资源
最近更新 更多