Un objeto temporal de tipo de clase sigue siendo un objeto. Vive en algún lugar de la memoria, lo que significa que no hay nada inusual en el compilador que pueda adjuntarle una referencia. En el nivel físico, ya sea una referencia constante o una referencia no constante, no hay diferencia. En otras palabras, en casos como ese, la restricción del lenguaje es puramente conceptual, artificial. El compilador simplemente ignora esa restricción. No hay necesidad de "transformar" nada aquí. La referencia se adjunta directamente al objeto, donde sea que ese objeto resida.
Básicamente, para una clase que proporciona la palabra exterior con acceso al valor de su puntero this
(o con acceso lvalue a *this
) el comportamiento puede ser inmediata y fácilmente simulado
struct S {
S& get_lvalue() { return *this; }
};
void foo(S& s);
...
foo(S().get_lvalue());
El código anterior es perfectamente legal y funciona en torno a la restricción mencionada. Puedes pensar en el comportamiento de MSVC++ como equivalente a esto.
AFAIK, Visual Studio 2010 (y quizás 2008) también admite este comportamiento. El compilador de VC++ permite modificar objetos temporales. – flamingo
Tenga en cuenta que este es un estilo pobre en el mejor de los casos y propenso a errores en el peor (["¿No le importa que sea un cambio temporal que está modificando?"] (Http://stackoverflow.com/a/1565811/768469)) – Nemo
@ flamingo: Bueno, nunca ha sido ilegal modificar objetos temporales en C++. Siempre se ha permitido llamar a funciones de miembros temporales que no const * modifying * en C++. Sin embargo, adjuntar referencias no const usando sintaxis "directa" es ilegal. El primero realmente le permite a uno trabajar alrededor de este último, como se muestra en mi respuesta. – AnT