Re: suerte en los firings
Hola Hernán,
> Hola Fernando,
> Aca andamos, todavia no me canse, pero en esta epoca dan ganas de
> volver. Lo bueno es que tenemos 24, 25 y 26 libres (igual que 31, 1 y 2).
>
Groso Google!
> Bueno, te cuento que"const int& r = 1 ;" compila y corre, y ademas si
> usas r, esta referencia al valor 1, con lo cual anda, trate de dedicarle
> un rato, pero no llego a deducir que esta haciendo el compilador.
> Por favor decime que pasa con eso porque me esta intrigando mucho, jaja
>
OK, veamos:
Todo "objeto" es aquello que tiene "storage", es decir que ocupa un
lugar en memoria. (1.8 en el standard)
Toda referencia "refiere" a un objeto (o subobjeto) o una función (8.5.3)
Todo lvalue (digamos toda variable) corresponde a un objecto (3.10) y
por tanto toda referencia puede initializarse con un lvalue.
Un rvalue puede ser de tipo fundamental (enteros, floats, etc), o de
tipo clase, o de tipo array.
Si el rvalue es de tipo clase o array entonces corresponde a un objeto
(que por tanto tiene storage):
struct X {} ;
X foo();
foo() es un rvalue de tipo X.
Una referencia no constante solo puede referir a un lvalue, por tanto:
X& rx = foo(); // ERROR, foo() es un rvalue, no un lvalue
Pero una referencia constante puede referir además a un rvalue:
X const& crx = foo(); // OK, const& puede referir a un rvalue
Y este rvalue puede ser de tipo fundamental (entero, flotante, etc)
double const& crd = 2.3 ;
Un objeto es un rvalue en lugar de un lvalue cuando es un objeto
temporario (como el que devuelve foo).
Por tanto, cuando una referencia constante refiere a un rvalue de tipo
clase está 'bindeando' a un objeto temporario (que existe de por sí, por
el mismo rvalue y no un lvalue)
Cuando la referencia refiere a un rvalue de tipo fundamental, no existge
en sí mismo un objeto correspondiento al rvalue y entonces se CREA un
objeto temporario para que exista un objeto al cual referir (8.5.3/5)
double const& crd = 2.3 ; Ahora existe un objeto correspondiente a 2.3
El objeto referido por crd es temporario y rvalue, pero objeto al fin
(de lo contrario no podría haber una referencia al mismo)
Que la referencia siempre refiera a un objeto, aun cuando este sea un
temporario (cuando 'bindea' un rvalue) hace posible esto:
X const& crd = foo();
X const* p = &crdK:
siendo que no es posible directamente esto:
X const* p = foo();
Para ello, los temporatios que ocurren de bindear una referencia a un
rvalue (temporario que puede existir de por si mismo cuando el rvalue es
de tipo clase) ven su cliclo de vida explicitamente 'extendido' al de la
referencia (12.2/5).
Nota: Desde el punto de vista del nuevo estandard (C++0x), todo lo
anterior corresponde a las ahora llamadas "lvalue references". Exite un
nuevo tipo de referencias llamadas "rvalue references", declaradas con
"&&" en lugar de "&", de las cuales voy a hablar en otro post.
Saludos
Fernando