In several occasions, C++ requires the use of integral constant expressions, for instance: array bounds, case expressions, bit-field lengths, and enumerator initializers must all be integral constant expressions. An integral constant expression is one of the following:
A numeric literal:
x<100; // 100 is a constant expression
Enumerators:
enum state { up, down};//up & down are constant expressions
Const variables or static data members of integral or enumeration types initialized with constant expressions:
const int x = 0; // x is a constant expression
Non-type template parameters of integral or enumeration types:
S < 100 > s; // a template argument
Sizeof expressions:
sizeof (int);