3.2.3a Expresiones constantes
§1 Sinopsis
Una expresión constante es aquella que solo implica a constantes (queda reducida a una constante), por lo que puede ser evaluada en tiempo de compilación y debe evaluarse a un valor que esté en el rango de valores admitidos para el tipo que se declara. Por ejemplo, si estamos declarando una constante tipo int, la expresión debe reducirse a un int:
int const peso = 50 + 20;
Los operandos de las expresiones constantes pueden ser constantes enteras ( 3.2.3b); constantes carácter ( 3.2.3d); constantes fraccionarias ( 3.2.3c); constantes de enumeración ( 3.2.3g); expresiones sizeof ( 4.9.13); expresiones de modelado de tipos ( 4.9.9), e incluso otras expresiones constantes, aunque en ciertos casos se imponen algunas restricciones .
Las expresiones constantes se evalúan como el resto de las expresiones con variables y pueden utilizarse en cualquier caso en que sea legal el uso de una constante.
§2 Sintaxis
expresion-constante:
Expresion-condicional
§3 Ejemplo
#define LEAP 1 /* en años bisiestos */
int days[31+28+LEAP+31+30+31+30+31+31+30+31+30+31];
§4 Las expresiones constantes no pueden contener ninguno de los operadores indicados a continuación
a menos que los operadores estén contenidos dentro del operando de un operador
sizeof
( 4.9.13).
Asignación int const k = 2+(kte = 4); // Error
Coma int const k = (i=1, 3); // Error
Decremento int const k = kte--; // Error
Llamada a función int const k = func(4); // Error
Incremento int const k = kte++; // Error
§5 Existen múltiples situaciones en las que el compilador C++ exige la presencia de expresiones constantes
enteras (que se resuelvan a un entero). Por ejemplo, para establecer el tamaño del campo de bits de una estructura
( 4.5.9); el valor de una constante
de enumeración (
3.2.3g); el tamaño de una matriz (
4.3.1) o el valor de una constante case (
4.10.2).
§6 Expresiones constantes restringidas
Las expresiones constantes utilizadas en las directivas de preproceso ( 4.9.10d) están sujetas a ciertas restricciones adicionales, por lo que son conocidas como expresiones constantes restringidas. Entre estas restricciones se encuentran que no pueden contener constantes fraccionarias; tampoco expresiones sizeof, constantes de enumeración ni expresiones de modelado de tipo.