什么是左值

What is an lvalue?

本文关键字:什么      更新时间:2023-10-16

可能重复:
什么是rvalues、lvalues、xvalues、glvalues和prvalues?

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

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

我的一个朋友问我什么是左值,什么是右值。我大致告诉了他是什么,他要求得到一个更完整的答案。我叫他去读标准书。他拒绝调戏自己的大脑,并表示他确信某个东西必须有的必要和充分条件才能成为左值。

有吗

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

我希望问题是清楚的。

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

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

l值是指内存位置。这是我能说的最简单的一句话。r值可以是l值r值只是表达式或常数的结果

可能只是有点混淆了可修改的左值和非左值。右值可以是左值,也可以是非左值。术语可修改的左值是在引入const修饰符之后使用的(参见维基百科关于值的条目)在C++中,每个表达式都返回一个左值、右值或无值。当左值显示为右值时,它会隐式转换为右值(请参阅IBM关于值类型的介绍)