On Wednesday, November 29, 2017 at 1:31:02 PM UTC-5, Enrico Maria Giordano wrote:
> Il 29/11/2017 19:20,
fma...@gmail.com ha scritto:
>
> >> "Ogni espressione C++ è un lvalue o un rvalue. [...]
> >
> > No, non è così da un po'.
> > Da C++11 ci sono rvalues, lvalues, xvalues, glvalues, e prvalues. E tutto
> > per stare dietro a questa roba del move.
> > Uno dei tanti riferimenti:
> >
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3055.pdf
>
> Azz!... :-(
>
:) Non ti preoccupare, tutte queste definizioni sono utili solo per chi
scrive le specifiche e agli implementers. Al programmatore normale non
importa molto come si chiami questo o quello, o cosa debba fare il
compilatore in casi borderline.
Anche fosse, il concetto non è difficile: invece di dividere le espressioni
in sinistra e destra, le dividi secondo due proprietà: identificabile
(e.g. variabili, puntatori, ma non roba temporanea) e spostabile.
Hai roba identificabile e spostabile, roba identificabile e non spostabile,
roba non identificabile e basta, etc.
La "genialata" è stata che invece di usare nomi decenti per la nuova
categorizzazione delle espressioni hanno riusato i vecchi lvalue/rvalue
con significati nuovi :(
Comunque, tutta la roba spostabile è rvalue (se è "pura", cioè temporanea
o non identificabile, in altra parole come ce l'abbiamo sempre avuta in mente,
prvalue).
Lvalue sono le cose identificabili e non spostabili.
Le robe identificabili e spostabili son queste nuove strane che vengono
fuori con riferimenti modificabili, e l'hanno chiamate xvalue.
L'ultima categoria, glvalue, è solo il "genitore" di lvalue e xvalue, e sta
lì solo per completare lo schemino.
Spero sia un po' più chiaro :)
Ciao!