What is an lvalue?
Possible Duplicate:
What are rvalues, lvalues, xvalues, glvalues, and prvalues?
C++标准,主要在第5章中,命名为表达式,定义哪些表达式是LValk,哪些是RValk。我读过那一章,我相信我能正确区分lvalues和rvalues。
然而,在我读了好的C++书籍和/或标准之前,我曾经认为LValk是一种可以站在赋值左侧的东西,而rValk是不能用的东西。显然,对于这种幼稚的定义,有许多反例。过了一段时间,我认为左值是有地址的,右值是没有地址的,这也有一些反例,比如说,一些临时对象,很明显,这些对象确实有地址。
我的一个朋友问我什么是左值,什么是右值。我大致告诉他这是什么,他要求一个更完整的答案。我叫他去读标准。他拒绝骚扰自己的大脑,并说他确信一定有一些必要和充分的条件使某些东西成为左值。
有?
例如,左值是非常量引用可以绑定到的值。但这一次并不令人满意。我在寻找一些更明显的东西,一些易于解释的东西,而不必考虑每种表达类型…
我希望问题很清楚。
- 我相信你太过努力了,不可能对每一个都有一个专属的定义。有些元素既可以是lvalues也可以是rvalues。int a; int b; b = 4; a = b;
- 不久前有一个类似的问题,基本要点是返回结构的函数也可以被分配。所以你可以做一些像foo()=之类的事情。问题是:stackoverflow.com/question s/6111905/c-is-return-va lue-a-l-va‌&8203;lue(从下面的低评级答案中删除)
- 或者:什么是rvalues、lvalues、xvalues、glvalues和prvalues?
- 我很失望这个问题被认为是任何建议链接的副本。
- 我不认为你能得到一个比"lvalues-name-objects"更简单的近似值。"价值观是在他们生活的全部表达结束时蒸发的暂时性的东西。"
- @詹姆斯:我真的很喜欢这个定义
- lvalue是一个表达式,可以将&运算符应用于该表达式。
- @弗雷德:你也可以应用于临时对象。
- @Armen:临时对象可以用lvalues和rvalues表示,但是&expression只在expression是lvalue时才起作用。你不能说&(string("hello")),因为string("hello")是一个右值。但是,如果variable是对const的左值引用或绑定到临时对象string("hello")的右值引用,则可以说&variable。
很简单,一个右值是当表达式结果不能在所述表达式结束后继续存在。左值遗嘱。这个基本原则是支持移动语义和右值引用的——您可以毫无问题地修改它们,因为您知道对象的生命已经结束。
- 这不是真的-您可以有一个指定临时对象的左值和一个指定静态存储持续时间对象的右值(以及其他可能性)。
我发现把lvalues看作是"有名字的东西"是最有用的简化方法。表达式++x是一个左值,名称为x。相比之下,rvalue是"没有名字的事物"。x++是一个右值,因为它产生一些未命名的值。
- +1.实际阅读和理解我的问题。但是int&f()int*p=new int;return*p;f()的名称是什么?:)
- @armen:0x830dboff,或任何地址new int发生屈服。我从没说过你需要知道这个名字-p
- @丹尼斯:在这种情况下,我们不能把一个临时对象看作一个有名字的对象吗(因为它有地址)?
- 但是说真的,你不会得到一个简单易懂的涵盖所有用例的答案。如果你想的话,把这个和"有地址"的答案结合起来,如果你记住临时物品不需要地址的话,你可能会非常接近。
- @临时工不需要地址。int f();如果系统的调用约定允许该函数在寄存器中而不是堆栈上返回其值,那么它生成的临时函数的地址是什么?
- stackoverflow.com/questions/6162226/what-rvalues-have-name(rvalues可以有名称(很多有),lvalues可以错过名称(很多没有)。
- @丹尼斯,f()是一个右值,但不是暂时值。事实上,可以说每个临时工都有地址。每个临时对象都是一个对象,而对象是一个存储区域。但是C++中没有临时的名称(但不是每个无名对象都是临时的!).
- @约翰纳斯:我说这是一个简化,别管我。——P开玩笑,我很感谢你的澄清。我对我的术语(特别是名字的非正式含义)有点松懈,但我不明白这个函数是如何产生一个临时对象的?
可能你只是对可修改的左值和非左值有点困惑。rvalues可以是lvalues或non-lvalues。术语modifiable lvalue在引入const修饰符后使用(参见wikipedia的values条目)。在C++中,每个表达式返回一个左值、rValor或无值。当一个LValk作为一个R值出现时,它隐式地转换成一个R值(参见值类型上的IBM)。
- 不,我不认为我混淆了这些概念
- 常量限定符不需要证明不可修改的左值:这里,int x[3];是不可修改的左值。"rvalues可以是lvalues或non-lvalues"这是不正确的:没有rvalue是lvalue。每个表达式要么是左值,要么是右值。有一个隐式转换允许将左值转换为右值。
L值是指内存位置。这是我能说的最简单的事情。R值可以是L值。R值只是表达式或常量的结果
- "R值可以是L值""否";表达式是rValor或LValk(在C++ 98中);