2010-10-09 10 views
9

¿qué significa realmente el mensaje de error "Lvalue required"?lvalue required

+0

posible duplicado del error ["l-value required"] (http://stackoverflow.com/questions/1353384/l-value-required-error) –

+0

@Paul, eso es sobre C++. –

Respuesta

7

Un valor izquierdo es algo que puede aparecer en el lado izquierdo de una asignación, en otras palabras 'algo que se puede asignar'

lo tanto, buscar un trabajo donde el lado izquierdo no es 'asignable' por ejemplo, algo tan simple como esto podría desencadenar un error de este tipo

if (0 = foo) 
{ 

} 

Aquí tienes un intento de asignar a una constante debido al uso accidental = en vez de ==

Véase también

5

Significa que la aplicación espera un objeto, sino que acaba de pasar un valor o función. Esto sucede para las asignaciones que pasó a operaciones que no sean de valor l o para la dirección de las aplicadas a las no funciones.

Lvalue significa "valor de ubicación" y significa una expresión que hace referencia a un objeto declarado como register o a una ubicación de memoria. Algo como 42 es un valor que no coincide con ninguno de los criterios. Más formalmente hay tres categorías

  • Lvalues: Refiriéndose a los objetos. Esto incluye objetos declarados const. Tales son lvalues ​​no modificables.
  • Designadores de funciones: en referencia a las funciones. printf es un designador de función, pero &printf no lo es, mientras que *&printf es de nuevo.
  • Otros: A veces llamado "rvalue" y por el estándar descrito como "el valor de una expresión". Los ejemplos son var + 0 (produciendo un valor no asociado con objetos más), o un enumerador de una enumeración. &printf pertenece a esta categoría.
0

el error viene si codifica somrthing como function(parameter) = value; porque no puede asignar valor a nada que no sea un contenedor posible para él.

2

Los C99 estados estándar (6.3.2.1):


Un lvalue es una expresión con un tipo de objeto o un tipo incompleto distinta de vacío; si un lvalue no designa un objeto cuando se evalúa, el comportamiento no está definido. Cuando se dice que un objeto tiene un tipo particular, el tipo es especificado por el lvalue usado para designar el objeto. Un lvalue modificable es lvalue que no tiene tipo de matriz, no tiene un tipo incompleto, no tiene un tipo const-qualified, y si es una estructura o unión, no tiene ningún miembro (incluido, recursivamente, cualquier miembro o elemento de todos los agregados o uniones contenidos) con un tipo de const-qualified.

El nombre lvalue proviene originalmente de la expresión de asignación E1 = E2, en el que se requiere que el operando de la izquierda E1 ser un (modificable) lvalue. Quizás se considere mejor como que representa un objeto "valor de ubicación". Lo que a veces se llama rvalue se encuentra en esta norma internacional descrita como el "valor de una expresión".


En otras palabras, un lvalue es algo que se puede localizar para potencialmente cambiar. Un lvalue modificable es aquel en el que en realidad está permitido para cambiar.

Por ejemplo, la declaración C:

x = 7; 

es válida porque es un xlvalue. Por otra parte, la declaración:

14 = 7; 

no es válida porque es 14 no algo que se puede localizar a una asignación.

El fragmento:

const int x = 7; 

crea en realidad una llamada lvaluex a pesar de que usted no está autorizado a cambiarlo (no es modificable un `valor-I).

+1

nit picking, pero técnicamente esto también puede ser una variable que se declara con 'register', por lo que podría no tener una dirección. –

+0

"_si un lvalue no designa un objeto cuando se evalúa, el comportamiento no está definido._" excepto cuando el comportamiento es _not_ undefined: '& * (int *) 0;' (sic) – curiousguy

0

Lo más probable es que haya intentado asignar un valor a algo que no se puede asignar. Por ejemplo, ambos de los siguientes probablemente causarían ese error:

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

Cuestiones relacionadas