“Lvalue required”的错误信息实际意味着什么?
答案 0 :(得分:8)
左值可以出现在作业的左侧,换句话说就是“可以指定的东西”
所以,找一个左手边不是“可分配”的作业,例如,这样简单的东西可能会触发这样的错误
if (0 = foo)
{
}
这里你试图分配一个常量因为意外使用=而不是==
另见
答案 1 :(得分:6)
这意味着实现需要一个对象,但您只是传递了一个值或函数。对于传递非左值的赋值或应用于非函数的操作地址,会发生这种情况。
左值代表“位置值”,表示引用声明为register
或内存位置的对象的表达式。像42
这样的值是既不匹配标准的值。更正式地说,有三个类别
printf
是一个功能代号,但&printf
不是,而*&printf
则是。{/ li>
var + 0
(产生与对象无关的值)或枚举的枚举器。 &printf
属于此类别。 答案 2 :(得分:2)
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;
实际上会创建一个名为lvalue
的{{1}},即使您不允许更改它(它不是可修改的`左值)。
答案 3 :(得分:0)
如果您编写类似function(parameter) = value;
的内容,则会出现错误,因为您无法将值分配给任何不适合它的容器。
答案 4 :(得分:0)
很可能这意味着您尝试将值分配给无法分配的内容。例如,以下两种情况都可能导致该错误:
5 = 5; myObject-> myMethod()= 5;