C++ -ban minden kifejezés az alábbi három érték kategória közül pontosan egybe tartozik.

Ahhoz, hogy az ezek közti különbségek érthetővé váljanak, értenünk kell az identitás és a mozgathatóság fogalmát.

Tisztázni kell továbbá azt, hogy amikor egy kifejezést próbálunk jellemezni, akkor tényleg az egész kifejezésről egyben kell véleményt mondani. Tehát ha a $sin(2\theta)=2sin(\theta)cos(\theta)$ kifejezésről állapítok meg valamit, akkor nem a $2sin(\theta)cos(\theta)$ kifejezésről beszélek. A bal oldal és az egyenlőségjel is része a kifejezésnek. Ugyanakkor, ha mégis a $2sin(\theta)cos(\theta)$ a tárgyalt kifejezés, akkor lehet, hogy annak egész más lesz a megítélése, mint a $\theta$ változónak. Ennek tisztázása fontos, a későbbi félreértések elkerülése érdekében.

Identitás

Egy kifejezésnek akkor van identitása, ha tudunk rá hivatkozni a programunkban. Egy definiált változónak van identitása, mert a változó nevével hivatkozható.

Egy konstans “literál”-nak nincs identitása.

int a = 2;
int b = a;

Nem tudom azt mondani, hogy most azt a bizonyos konstans “2”-t szeretném elérni.

Az “a” változó viszont hivatkozható, és az értéke hozzárendelhető a “b” változóhoz.

Mozgathatóság

Egy kifejezés mozgatása azt jelenti, hogy át tudjuk adni a birtoklási jogát egy másik kifejezésnek.

Egy konstans értéket például hozzá tudunk rendelni egy változóhoz.

Igaz, hogy az előző példában az “a” változót is hozzárendeltük a “b” változóhoz.

Ebben az esetben viszont valójában csak az értékét másoltuk le.

“a” továbbra is megmaradt külön változóként.

Ez tehát nem számít mozgatásnak.

Bővebb információkért move szemantika témakörét érdemes megnézni.