c++ c rvalue lvalue

c++ - ¿Por qué el operador de pre-incremento da rvalue en C?



lvalue (3)

En C ++, el operador de preincremento da un valor porque se devuelve el objeto incrementado, no una copia. Pero en C, da valor. ¿Por qué?


C99 dice en la nota al pie (de la sección $ 6.3.2.1),

El nombre '''' lvalue '''' proviene originalmente de la expresión de asignación E1 = E2, en la que se requiere que el operando izquierdo E1 sea un valor (modificable). Quizás se considera mejor que representa un objeto "valor de localización". Lo que a veces se llama '''' rvalue '''' se describe en esta Norma Internacional como el '''' valor de una expresión '''' .

Espero que explique por qué ++i en C, devuelve rvalue.

En cuanto a C ++, diría que depende del incremento del objeto. Si el tipo del objeto es algún tipo definido por el usuario, entonces siempre puede devolver lvalue. Eso significa que siempre puede escribir i++++++++ si el tipo de i es el Index como se define aquí:

Comportamiento indefinido y puntos de secuencia recargados


Desde lo alto de mi cabeza, no puedo imaginar ninguna declaración útil que pueda resultar del uso de una variable pre-incrementada como un lvalor. En C ++, debido a la existencia de sobrecarga de operadores, puedo. ¿Tiene un ejemplo específico de algo que no puede hacer en C debido a esta restricción?


C no tiene referencias. En C ++ ++i devuelve una referencia a i (lvalue) mientras que en C devuelve una copia (incrementada).

C99 6.5.3.1/2

El valor del operando del operador pre fi x ++ se incrementa. El resultado es el nuevo valor del operando después del incremento . La expresión ++ E es equivalente a (E + = 1).

''''value of an expression'''' <=> rvalue

Sin embargo, por razones históricas, creo que las "referencias que no forman parte de C" podrían ser una posible razón.