--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"
Me parece genial lo que proponés (hace mucho que quiero hacerlo en la
lista y es my bueno que tomes la posta :)
También me parece bien el orden que proponés, y muy en especial
comenzar con los conceptos basicos de lvalue y rvalue.
Es que en C++11, el tema de "move" y el "&&" se apoyan en una
extensión de estos: ahora tenemos glvalue, lvalue, rvalue, xvalue y
prvalue.
Pero como diría Jack el Destripador, vayamos por partes, y sin dudas
la primera es:
> Entonces por lo que vi en los diferentes foros deberiamos empezar con esta
> simple pregunta:
> Qué es un rvalue y que es un lvalue?
--
Fernando Cacciola
SciSoft Consulting, Founder
http://www.scisoft-consulting.com
Jaja, a simple vista puede parecer complicado pero en realidad tiene
mucho sentido y justamente lo que hace es permitir que muchas otras
cosas más avanzadas se puedan expresar, entender y hasta explicar más
sencillamente. Un poco como pasa con el hecho de distinguir entre L y
R values (cuando en otros lenguajes hay solo values)
Saludos
On Thu, Apr 12, 2012 at 2:10 PM, German Garcia <ggarc...@gmail.com> wrote:
> El c++ se estará poniendo muy complicado ? O yo me estaré volviendo viejo ?
> :)
>
> "ahora tenemos glvalue, lvalue, rvalue, xvalue y
> prvalue." ??! Pero demonios! Yo estaba contento con apenas distinguir "más o
> menos" rvalue y lvalue (l factible de ir a la izquierda y r sólo a la
> derecha del = )
>
Jaja, a simple vista puede parecer complicado pero en realidad tiene
mucho sentido y justamente lo que hace es permitir que muchas otras
cosas más avanzadas se puedan expresar, entender y hasta explicar más
sencillamente. Un poco como pasa con el hecho de distinguir entre L y
R values (cuando en otros lenguajes hay solo values)
Saludos
Bueno para mi lvalue y rvalue era algo como:
lvalue: a la izquierda del =, son cosas que tienen nombre y ocupan un lugar un tiempo (mientras dure el scope)
rvalue: a la derecha del =, son anónimos y temporales,
los valores de los enums y los non-type template parameter.
De la lista de ejemplos que tire yo diria:
1. char c; //lvalue
Hola Dani,
x = f() juega algo mas, hay temporales que se crean a la hora de devolver o copiar, esos temporales son rvalue, pero x es un lvalue
por que me decis pensalo mas..
char c; no declaro aqui un lvalue?
c= 1; //1 es el rvalue
x = c; //x y c son lvalue
Vos decis que c es una rvalue en el caso anterior, pero para mi es un lvalue porque puede ir del lado izquierdo del = y denota un objeto.
y por otro lado en el standard dice:
3.10 Lvalues and rvalues [basic.lval]
1 Every expression is either an lvalue or an rvalue.
O sea que la herencia multiple en tu ejemplo no tiene sentido
Vos decis que c es una rvalue en el caso anterior, pero para mi es un lvalue porque puede ir del lado izquierdo del = y denota un objeto.
y por otro lado en el standard dice:
3.10 Lvalues and rvalues [basic.lval]
1 Every expression is either an lvalue or an rvalue.
O sea que la herencia multiple en tu ejemplo no tiene sentido
Una variable es un rvalue o un lvalue, "dependiendo del contexto".Cuando la variable está del lado derecho del igual, es un rvalue,en C++, en Java, y en la China :D
Son las *expresiones* las que son l o r-value.
Entonces, una variable en si misma no es una expresión, y por tanto no
es ni l ni r ni nada value. Que no es lo mismo que decir que es tnato
l como r.. no es ninguna de las dos porque no es una expresion.
Entonces, "c", no es un value de ningún tipo. Es una variable.
Para decidir que "categoría de valor" (como se le llama a esta
taxonomía) es "algo" hay que referir a la expresion donde está ese
algo.
Esto es un poco lo que quiere decir Daniel conque depede de contexto o
que una variable es tanto una cosa como la otra. En realidad eso es
algo impreciso.
Entonces, volviendo:
"c es un rvalue en el caso anterior"
Daniel no está hablando de "c la variable" sino de la expresion del
caso anterior donde aparece c
(Daniel: pero en realidad no sé a cual te referís??)
De aquí mas, para este tema, recuerden: lo que imporan son las
expresiones. Un identificador (como c) por sí solo no es una
expresion.
Entonces entonces...
char c; //no es una expresion y no es nada
c = 5; //lvalue? yo veo un objeto ahi
x = f(); //lvalue (idem anterior)
const int i=5; //rvalue aca si
pero por otro lado las expresiones son compuestas entonces, por lo que lei (que me mando a leer dani :P )
c = 5; es un assignement-expression
formado por dos expresiones y un operador =... entonces en este caso c es una expresion lvalue y 5 rvalue ?
o esto ya no tiene sentido?
great!
Ahora, no era en español el foro?
:P
Es como que las expresiones son instanciaciones en el árbol semántico, de "cosas" subyacentes.
*exáctamente en ese punto del fuente*, c es un "declarator-id" (o sea
el nombre del objeto que estamos declarando), pero en ese contexto,
'c' no está en una expresión que denote a ese objeto que está siendo
declarado.
Entonces efectivamente no es ningún tipo de value.
>>
>> c = 5; //lvalue? yo veo un objeto ahi
>
>
> la expresión "asignar variable c" es lvalue,
> la expresión "constante 5" es un rvalue
>
Fijate que es el operador de asignación el que define la expresion, y
por eso el lvalue "en esa línea" sige sin ser 'c' (sino la expresion
de asignacion)
Lo mismo con:
char c = 1 ;
en ese punto, c es un declarator-id (aun cuando esto es no solo una
declaración sino ademas una definicion), y sigue sin ser l o r value.
para que podamos decir si c es un l o r value tenemos que ponerlo en
un contexto donde c denote al objeto al cual está refiriendo.
>>
>> x = f(); //lvalue (idem anterior)
>
>
> la expresión "invocar f sin parámetros" es un rvalue;
> la otra es lvalue
>
>>
>> const int i=5; //rvalue aca si
>>
Ese 'i' aparece en una expresion en el contexto donde se requiere un
lvalue, es un lvalue sin importar que sea contante (non-modifiable)
O sea, puedo hacer:
&i
porque i denota un objeto, y entonces 'i' ahí es un lvalue
NO es lo mismo un rvalue que un objeto constante
Quise decir:
*SI* ese 'i' aparece en una expresion...
Y eso es algo que NO pasa en el punto de definicion, porque una
definicion no es una expresion de asignacion que resulte en un lvalue
Es decir,
if ( ( c = 3 ) == 3 )
es posible porque la asignacion es una expresion, que resulta en un
lvalue cuyo valor es el del rvalue correspondiente al segundo operando
del =
Pero,
if ( ( int c = 3 ) == 3 )
no es posible justamente porque "int c = 3" no resulta en un value (de
ningun tipo). De lo contrario eso sería valido y el operator ==
tendria un valor a la izquierda para operar.
Saludos