【发布时间】:2010-10-09 08:48:55
【问题描述】:
错误信息“Lvalue required”究竟是什么意思?
【问题讨论】:
-
@Paul 那是关于 C++ 的。
错误信息“Lvalue required”究竟是什么意思?
【问题讨论】:
左值是可以出现在赋值左侧的东西,换句话说,“可以被赋值的东西”
因此,请寻找左侧不可“赋值”的赋值,例如,这样简单的事情可能会触发此类错误
if (0 = foo)
{
}
由于意外使用 = 而不是 ==,您尝试分配给常量
另见
【讨论】:
这意味着实现需要一个对象,但您只是传递了一个值或函数。这发生在您传递非左值的赋值或应用于非函数的地址操作。
Lvalue 代表“位置值”,表示引用声明为register 的对象或内存位置的表达式。 42 之类的值不符合任何条件。更正式地分为三个类别
printf 是函数指示符,但 &printf 不是,而 *&printf 又是。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 不是您可以为分配找到的东西。
sn-p:
const int x = 7;
实际上创建了一个名为 x 的 lvalue,即使您不允许更改它(它不是可修改的 `lvalue)。
【讨论】:
register 声明的变量,因此它可能没有地址。
&*(int*)0;(原文如此)
如果您编写像 function(parameter) = value; 这样的代码,则会出现错误,因为您无法为任何不可能的容器赋值。
【讨论】:
这很可能意味着您尝试为无法分配的东西分配值。例如,以下两种情况都可能导致该错误:
5 = 5; myObject->myMethod() = 5;
【讨论】: