Creo que la expresión T()
crea un valor r (según el Estándar). Sin embargo, el código siguiente se compila (al menos en gcc4.0):¿Por qué se permite T() = T()?
class T {};
int main()
{
T() = T();
}
sé técnicamente esto es posible debido a que las funciones miembro pueden ser invocadas en los temporales y lo anterior es sólo invocar el operador = en la rvalue temporal creada desde el primer T()
.
Pero, conceptualmente, esto es como asignar un nuevo valor a un valor r. ¿Hay una buena razón por la cual esto está permitido?
Edit: La razón por la que considero que esto es extraño es que está estrictamente prohibido en los tipos incorporados pero permitido en los tipos definidos por el usuario. Por ejemplo, int(2) = int(3)
no compilará porque es un "lvalue inválido en la asignación".
Así que supongo que la verdadera pregunta es, ¿fue este comportamiento algo inconsistente incorporado en el lenguaje por algún motivo? ¿O está allí por alguna razón histórica? (Por ejemplo, sería conceptualmente más sólido permitir que solo se invoquen las funciones miembro miembro en las expresiones rvalue, pero eso no se puede hacer porque eso podría romper algún código existente.)
Esto junto con la respuesta de FredOverflow responde a mi pregunta por completo. ¡Gracias! – Rimo