[英]What is the reasoning behind the naming of “lvalue” and “rvalue”?
C/C++ 中“左值”和“右值”的命名背后的原因是什么?
该标准提到了这一点:
左值(历史上如此称呼,因为左值可能出现在赋值表达式的左侧)[...]
右值(历史上如此称呼,因为右值可能出现在赋值表达式的右侧)[...]
也就是说,左值是您可以分配给的东西,而右值是您可以从中分配的东西。
然而,这已经逐渐离真相越来越远了。 不能分配左值的一个简单示例是const
变量。
const int x = 5;
x = 6; // Error
当涉及运算符重载时,您甚至可以在赋值的左侧出现一个右值。
我发现将左值视为引用存储在内存中的对象而将右值视为只是一个值(可能已从内存中读取)更有用。 这些概念很好地反映了这个想法。 一些例子:
&
) 的地址需要一个左值,因为您只能获取内存中某些内容的地址。 它不需要获取对象的值来计算其地址。std::move
将左值表达式转换为右值表达式可以被认为是诱使编译器认为存储在内存中的对象实际上只是一个临时值。然而,这也并非在所有情况下都成立。 这只是一个合理的比喻。
在过去,“左值”意味着可以放在赋值左侧的东西,而“右值”意味着可以放在赋值右侧的东西。
如果您考虑它们可以出现在赋值运算符的哪一侧,这是非常直观的:
left-value = right-value;
简单地说, lvalue
意味着你可以给它赋值, rvalue
意味着它只能出现在运算符的右侧。
在 C 中, lvalue
和rvalue
反映了赋值运算符中的用法。 rvalue
只能出现在=
的右侧,而lvalue
可以出现在任一侧。 在 C++ 中它类似,但更复杂。
有不可赋值的lvalues
,常量变量。
这是简化(稍微复杂的)概念的结果。
lvalue
是左值,即那些“可以在赋值的左侧”的值。 这又是一种简化,并非所有左值都可以按原样直接分配给(例如,数组不能,只有非const
数组的元素,因此需要下标)。
rvalues
是正确的值,那些只能在赋值表达式的右侧。
左值中的“l”源自“左”值(如来自赋值运算符的左侧); 然而,它现在代表位置值,指的是在内存中占据某些可识别位置(即具有地址)的任何对象。 右值现在是任何不是左值的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.