需要左值

错误信息“Lvalue required”究竟是什么意思?

左值可以出现在赋值的左侧,换句话说就是“可以分配的东西”

所以,寻找一个左手边不是“可分配”的赋值,例如,这样简单的东西可能会触发这样的错误

if (0 = foo) { } 

在这里你试图分配一个常量因为意外使用=而不是==

也可以看看

  • 经常使用很少定义的术语:左值
  • 左值和右值
  • “需要l值”错误

这意味着实现需要一个对象,但您只是传递了一个值或函数。 对于传递非左值的赋值或应用于非函数的操作地址,会发生这种情况。

左值代表“位置值”,表示一个表达式,该表达式引用声明为register或内存位置的对象。 像42的值是既不符合标准的值。 更正式地说,有三类

  • 左值:参考物体。 这包括声明为const的对象。 这是不可修改的左值。
  • function代号:参考function。 printf是一个函数指示符,但&printf不是,而*&printf是。
  • 其他:有时称为“rvalue”,并被标准描述为“表达的价值”。 示例是var + 0 (产生与对象不再关联的值)或枚举的枚举器。 &printf属于此类别。

C99标准规定(6.3.2.1):


lvalue是具有对象类型或除void之外的不完整类型的表达式; 如果lvalue在评估时未指定对象,则行为未定义。 当一个对象被称为具有特定类型时,该类型由用于指定该对象的lvalue指定。 可修改的lvalue是一个lvalue ,它没有数组类型,没有不完整的类型,没有const限定类型,如果是结构或联合,则没有任何成员(包括,递归地,任何成员)或具有const限定类型的所有包含的聚合或联合的元素。

名称lvalue最初来自赋值表达式E1 = E2 ,其中左操作数E1需要是(可修改的) lvalue 。 它可能更好地被视为表示对象“定位器值”。 有时被称为rvalue的东西在本国际标准中被描述为“表达的价值”。


换句话说, lvalue是您可以找到的可能发生变化的东西。 可修改的lvalue是您实际允许更改的值。

例如,C语句:

 x = 7; 

是有效的,因为xlvalue 。 另一方面,声明:

 14 = 7; 

是无效的,因为14 不是您可以找到的任务。

片段:

 const int x = 7; 

实际创建一个名为xlvalue即使你不允许改变它(它不是一个可修改的`左值)。

如果您编写somrthing function(parameter) = value;则会出现错误function(parameter) = value; 因为你不能为任何不可能的容器赋值。

很可能这意味着您尝试将值分配给无法分配的值。 例如,以下两种情况都可能导致该错误:

5 = 5; myObject-> myMethod()= 5;