需要左值
错误信息“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;
是有效的,因为x
是lvalue
。 另一方面,声明:
14 = 7;
是无效的,因为14
不是您可以找到的任务。
片段:
const int x = 7;
实际创建一个名为x
的lvalue
即使你不允许改变它(它不是一个可修改的`左值)。
如果您编写somrthing function(parameter) = value;
则会出现错误function(parameter) = value;
因为你不能为任何不可能的容器赋值。
很可能这意味着您尝试将值分配给无法分配的值。 例如,以下两种情况都可能导致该错误:
5 = 5; myObject-> myMethod()= 5;