在C / C ++中命名“左值”和“右值”背后的原因是什么(我知道它们是如何运作的)?
答案 0 :(得分:11)
标准提到了这个:
左值(所谓的历史,因为左值可能出现在赋值表达式的左侧)[...]
一个rvalue(历史上所谓的,因为rvalues可能出现在赋值表达式的右侧)[...]
也就是说,你可以分配一个左值,并且你可以分配右值。
然而,这已逐渐从事实中走得更远。无法分配左值的简单示例是const
变量。
const int x = 5;
x = 6; // Error
当涉及运算符重载时,您甚至可以在赋值的左侧显示右值。
我认为将左值作为引用存储在内存中的对象和将右值作为一个值(可能已经从内存中读取)的引用更有用。这些概念很好地反映了这个想法。一些例子:
&
)的地址需要左值,因为您只能获取内存中某些内容的地址。它不需要获取对象的值来计算其地址。std::move
将左值表达式转换为右值表达式可以被认为是欺骗编译器认为存储在内存中的对象实际上只是一个临时值。然而,这在任何情况下都不会有所体现。这只是一个合理的比喻。
答案 1 :(得分:3)
在过去的日子里,“左值”意味着可以在作业的左侧侧进行,而“右值”意味着可以进入右侧< / strong>作业的一面。
答案 2 :(得分:3)
如果您考虑可以出现的赋值运算符的哪一侧,那就非常直观了:
left-value = right-value;
松散地说,lvalue
表示您可以分配给它,rvalue
表示它只能出现在运营商的右侧。
答案 3 :(得分:1)
在C中,lvalue
和rvalue
反映了赋值运算符的用法。 rvalue
只能显示在=
的右侧,而lvalue
可以位于lvalues
的任何一侧。在C ++中,它类似,但更复杂。
有不可分配的{{1}}常量变量。
答案 4 :(得分:0)
这是简化(稍微复杂一点)概念的结果。
lvalue
是左值,i。即那些“可以在任务的左侧”。这又是一个简化,并非所有左值都可以直接分配到原样(例如,数组不能,只有非const
数组的元素,因此需要下标。)
rvalues
是正确的值,这些值只能位于赋值表达式的右侧。
答案 5 :(得分:0)
左值中的“l”源自“左”值(如赋值运算符的左侧);然而,它现在代表位置值,指的是在内存中占据某些可识别位置(即具有地址)的任何对象。右值现在是任何不是左值的东西。