[WikiItic] [TitleIndex] [WordIndex

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:

   1 const int a = 12;
   2 int b;
   3 
   4 a = 12;
   5 b = a;

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:

   1 const char **cpp;
   2 char *p;
   3 const char c = 'A';
   4 
   5 cpp = &p;
   6 *cpp = &c;
   7 *p = 0;

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—

   1 int f(int *const a) {
   2     return *a + 5;
   3 }
   4 
   5 int main() {
   6     int a = 12;
   7     const int k = 12;
   8     int b;
   9 
  10     b = f(&a);
  11     b = f(&k);
  12 
  13     return 0;
  14 }


CategoryApunts


2023-07-03 11:46