Sobre el qualificador const
El qualificador const s'aplica a un tipus de dades per canviar-ne el significat i indicar que el els objectes del nou tipus són de naturalesa constant, és a dir que el valor de l'objecte en qüestió no pot ser modificat. Precisament per aquesta raó, un objecte d'un tipus qualificat const només té un comportament distint del tipus no qualificat en el cas que actuï com a l-valor (§6.7.3). L'assignació, particularment, demana un l-valor modificable a l'esquerra, i.e.: no const (§6.5.16).
L-valor
(§6.3.2.1) Un l-valor (l-value) és una expressió de qualsevol tipus excepte void que en ser avaluada denota un objecte. Un l-valor modificable és un l-valor que no és un tipus array, un tipus incomplet, un tipus const o un tipus struct/union amb un membre o element (recursivament) amb qualificació const.
Per exemple:
en aquest cas la primera assignació és errònia, atès que a és u l-valor d'un tipus qualificat amb const, cosa que és errònia. D'altra banda, en la segona assignació, que és correcta, en l'expressió a el qualificador const no té cap afectació atès que a no es un l-valor.
L'estàndard també fa notar que, si s'intenta modificar un objecte d'un tipus amb qualificador const a través d'un l-valor sense qualificador const, el resultat és indefinit. En el següent exemple se'n pot veure un cas:
El modificador const en els paràmetres
Pel que fa a l'ús del modificador const en els paràmetres d'una funcio, cal tenir en compte que el seu efecte afecta a l'ús del paràmetre en el cos de la funció però no té efecte sobre els arguments en el moment de la crida. L'estàndard diu (§6.5.2.2): en una crida, un argument ha de ser d'un tipus tal que un valor d'aquest tipus pugui ser assignat a un objecte del tipus no-qualificat del paràmetre.
Aquesta semàntica explica per què el següent exemple és correcte tot i que es susceptible de produir warnings —però no errors—
- (6.3.2.1)
(6.3.2.1) Llevat de quan és operand de sizeof, & o és un literal string usat com inicialitzador d'un array, una expressió de tipus array de T es converteix a referència a T que apunta al primer element de l'array i no és un lvalue.