Durante los últimos días, algunos de nuestros lectores nos han informado que han sufrido un error de 1 valor.
Aprobado: Fortect
Este error ocurre cuando colocamos constantes a la izquierda con respecto al operador = y variables al excelente. Por lo tanto, toman arr ya que la dirección junto con el lado de la parada es constante, por lo que es muy probable que el mismo error aparezca como el valor L requerido.
ArchnzacSe utiliza como una variable del mundo moderno e indica un error útil que se adaptó durante la llamada a una función. Puede encontrar una variedad de códigos de error en
“lvalue” es un objetivo de asignación. “L” significa izquierda, ya que la mitad izquierda es un símbolo. Rvalue es el valor del dígito correcto y genera un valor que no se puede y, por lo tanto, no se puede asignar directamente. Si obtiene un “lvalue requerido” efectivo, esa persona tiene una expresión que devuelve un rvalue cuando hay un lvalue involucrado.
Para el modelo, una constante debe ser un valor r, pero no un valor l de bueno. Entonces:
1 = 2; // No bien entrenado, asignación de rvalueint i; (i + 1) suele ser 2; // Formado incorrectamente, rvalue pone bolgreat value.
int i;i = 2;
Hazlo. Tenga en cuenta que puede devolver algún tipo de lvalue de una función; Por ejemplo, puede obtener una referencia a un objeto que puede utilizar el operador = ().
Como señaló Pavel Minaev en los comentarios, esta nunca es la definición habitual de lvalues y rvalues en este lenguaje respectivo, sino más bien un intento de informar a alguien que tiene un error en el uso de rvalues y donde un valor se considera algún tipo de criterio necesario. C ++ es un lenguaje que tiene muchos detalles; Si quieres puedes venir oficialmente, debes contactar con un portavoz autorizado.
Las circunstancias lvalue y rvalue no se encuentran comúnmente en la programación C / C ++, pero cuando se implementa, su significado generalmente no es evidente de inmediato. Muy a menudo, estos términos se incluyen en los mensajes de advertencia de error del compilador y. Ejemplo de compilación si miras con gcc :
Así es, el código de la idea es intrínsecamente retorcido y no es lo que la mayoría de la gente escribiría, pero como menciona la comunicación de errores lvalue, es un término que se encuentra a menudo en los tutoriales de C / C ++. Otro ejemplo es compilar siempre esta contraseña con gramos ++ :
Aquí el error es nuevamente comparable al críptico rvalue. Entonces, ¿qué significa realmente lvalue rvalue en C y C ++? Esto es lo que quiero explorar en este valioso artículo.
Aprobado: Fortect
Fortect es la herramienta de reparación de PC más popular y eficaz del mundo. Millones de personas confían en él para mantener sus sistemas funcionando de forma rápida, fluida y sin errores. Con su sencilla interfaz de usuario y su potente motor de análisis, Fortect encuentra y soluciona rápidamente una amplia variedad de problemas de Windows, desde la inestabilidad del sistema y los problemas de seguridad hasta la gestión de la memoria y los cuellos de botella en el rendimiento.
int foo () beneficio 2;int main () foo () probablemente será 2; Devuelve 0;
test.c: En el aspecto" principal ":test.c: 8: 5: lvalue error: dirigido como un operando de asignación accesible
¿Cuál es la definición? del valor L?
En realidad, el valor de l está vinculado a lo siguiente: el concepto de variables de un tipo; Una palabra de subíndice ([]) que no coincide con una matriz específica. Aspecto indirecto unario (*) que no puede referirse a una matriz. Expresión que tiene que ver con el valor L entre paréntesis.
testcpp.cpp: sobre la función int & foo ():testcpp.cpp: 5:12: Error: inicialización incorrecta de un enlace no persistenteEl tipo a hacer combinado con 'int &' de tipo 'int'
Definición práctica
Esta sección contiene una historia intencionalmente simplificada de lvalues y rvalues. El resto del artículo en particular explicará esto.
El
Que es un ejemplo de un error de lvalue?
Los errores de lvalue ocurren cuando el nuevo lvalue normalmente no es una variable que pueda tener una ventaja. LValue es una constante válida (o) no es simplemente variable. Estos son caracteres alfanuméricos de un solo uso. (5, un definido, 6,9, $, etc.) Ejemplo: en lugar de a equivale a 5; en el programa anterior si realmente pudiera ser 5 = a; será cualquier buen error de LValue. LValue es una variable constante.
lvalue (valor del localizador) representa el objeto en el que todo el hecho ocupa una ubicación identificable (es decir, la memoria RAM genera una dirección).
rvalue se define por omisión, diciendo que cada expresión es un solo lvalue o un rvalue. Así, un rvalor serio, lejos de la definición de lvalor antes mencionada, es un término que no significa en el que un objeto ocupa una ubicación identificable que vende memoria.
Ejemplos simples
Los términos encima pueden parecer vagos, por lo que es asombrosamente importante omitir correctamente algunos ejemplos simples que hemos visto.
Supongamos que tenemos una variable entera percibida y solicitada:
La asignación espera un valor l interesante como su operando izquierdo, y es probable que var sea un valor l, dado que es un elemento identificable. Los siguientes efectos de la madre naturaleza no son válidos en su página actual:
Ni la constante entera 4 ni la expresión var + 1 podrían ser valores l (lo que los convierte en valores r). Este no es nunca un valor l, porque ambas respuestas son expresiones temporales sin una ubicación identificable exacta (es decir, deberían haber estado recientemente en el registro temporal de la parte más importante del cálculo). además, no hay significado semántico, no hay ningún lugar para asignar.
Por lo tanto, el significado del mensaje de error de una persona en el primer fragmento de código es realmente claro. foo devuelve un valor temporal en particular, que es un rvalor increíblemente bueno. Intentar asignarlo es un error eficaz, si es así, foo () implica 2; por lo general, el compilador se queja de que esperaba que vieras un lvalue con el operador de asignación en la izquierda.
Un valor real de 1 envía una expresión al elemento que existe después de él. El valor r se ha convertido en un valor temporal importante que no se usa fuera de la expresión que lo usa.
Sin embargo, no todas las asignaciones al resultado de la llamada de función genérica son inválidas. Por ejemplo, las fuentes de C ++ lo hacen posible:
Aquí foo obtiene una conexión, que es un valor útil I to y se puede asignar. De hecho, la capacidad de C ++ para aceptar valores l del rendimiento es importante para implementar otros operadores sobrecargados. Un ejemplo típico es sobrecargar al hook person [] en clases que implementan algún tipo de acceso de búsqueda. std :: manual hace lo siguiente:
La asignación junto con mymap [10] funciona porque su std :: map :: operator [] extra no constante devuelve un mapa que puede ser asignado.
d implica var; // ¡CULPA!(var + 1) es igual a 4; // ¡CULPA!
int globalvar = 20;int & foo () Pague por una variable global específica;int main () foo () es 10; rey 0;
lvalue significa entrada por la izquierda. En lo personal, el lado izquierdo merece un operador de asignación. rvalue da como resultado el valor real de la página. En particular, es una calificación realmente mala o una frase del vendedor de la asignación.
std :: guidebookmymap;mymap [10] = 5,6;
Valores editables I.
Originalmente, después de que se crearon lvalues para It c, esto podría literalmente “valores adecuados para el lado izquierdo de nuestra asignación”. Sin embargo, más tarde, cuando ISO C contenía esas palabras clave const , esta definición tuvo que aclararse. Después de todo:
Entonces, una aclaración más como forma de agregar. No todos los valores de l pueden seguir afectados. Estos valores se pueden cambiar. Formalmente, el tipo de estándar C99 se convierte en valores mutables, por ejemplo:
el lvalue moderno no tiene una variedad de matriz de, no usa un tipo incompleto, tiene y no tiene un último tipo const calificado y, dentro del es una estructura o unión completa, g ‘no tiene un miembro definido (incluyendo, recursivamente, cada elemento individual o parte de todos los agregados o uniones mantenidos) con una const calificada.
const int significa 10; // 'a' es el costo 1a es igual a 10; // ¡pero no se puede asignar!
Conversión entre valores L y valores R
Por lo general, las construcciones de lenguaje verbal que operan en sus objetos asumen que los valores r son necesarios como buenas razones. Por ejemplo, el operador de suma binaria '+' toma dos valores r disponibles como argumentos y, por lo tanto, devuelve un valor r:
Como vimos anteriormente, a y b normalmente son dos valores L. Por lo tanto, en la tercera matriz, convierten implícitamente el valor l en el valor r actual. Todos los valores l, que, a su vez, a menudo no lo son, son matrices, tareas o tipos incompletos, y pueden convertirse en valores r.
¿Y viceversa? ¿Se pueden reemplazar rvalues por lvalues? ¡Por supuesto no! Esto probablemente debería violar la naturaleza de un valor sólido como se define [1].
Esto no sugiere que lvalues no se puedan generar explícitamente lejos de rvalues. Por ejemplo, cualquier operador unario '*' (desreferencia) toma un nuevo argumento rvalue agradable, aunque esencialmente produce un resultado lvalue. Eche un vistazo a este código válido:
Acelere el rendimiento de su computadora ahora con esta simple descarga.