¿Por qué el primero devuelve una referencia?
int x = 1;
int y = 2;
(x > y ? x : y) = 100;
Mientras que el segundo no?
int x = 1;
long y = 2;
(x > y ? x : y) = 100;
En realidad, el segundo no compiló en absoluto: "no queda el valor restante de la asignación".
Respuestas:
Las expresiones no tienen tipos de retorno, tienen un tipo y, como se conoce en el último estándar de C ++, una categoría de valor.
Una expresión condicional puede ser un lvalue o un rvalue . Esta es su categoría de valor. (Esto es algo así como una simplificación,
C++11
ya que tenemos lvalues, xvalues y prvalues).En términos muy amplios y simples, un valor l se refiere a un objeto en la memoria y un valor r es solo un valor que no necesariamente se puede adjuntar a un objeto en la memoria.
Una expresión de asignación asigna un valor a un objeto, por lo que la cosa a la que debe asignarse debe ser un valor l .
Para que una expresión condicional (
?:
) sea un valor l (nuevamente, en términos amplios y simples), el segundo y tercer operandos deben ser valores del mismo tipo . Esto se debe a que la categoría de tipo y valor de una expresión condicional se determina en tiempo de compilación y debe ser apropiada independientemente de si la condición es verdadera o no. Si uno de los operandos debe convertirse a un tipo diferente para que coincida con el otro, entonces la expresión condicional no puede ser un valor l, ya que el resultado de esta conversión no sería un valor l .fuente
an rvalue is just a value that may not necessarily be *attached* to an object in memory.
¿Puedes explicar esto en un término más simple? . Además, ¿qué quieres decir contype and value *category*
? Graciasprvalue, xvalue, glvalue
son categorías de valores.true
,this
,enum
valores. Esas cosas son valores (valores "puros"), pero no viven en la memoria.El tipo de la
?:
expresión ternaria es el tipo común de su segundo y tercer argumento. Si ambos tipos son iguales, obtendrá una referencia de nuevo. Si son convertibles entre sí, uno se elige y el otro se convierte (promovido en este caso). Como no puede devolver una referencia lvalue a una temporal (la variable convertida / promovida), su tipo es un tipo de valor.fuente
No puede devolver un valor l ya que tendrá que promover implícitamente el tipo de
x
para que coincida con el tipo dey
(ya que ambos lados de:
no son del mismo tipo), y con eso tiene que crear un temporal.¿Qué dice el estándar? ( n1905 )
Expresiones 5.17 Operadores de asignación y asignación compuesta
fuente