The placement of the
const qualifier on a type is generally dictated by the language, except when it is modifying the base type. When it is modifying the const-ness after a
* (pointer), it must be placed after the
int* const p = 0; int* const* const p2 = 0;
But, when modifying a base type, it may be placed on either side of it.
int const i = 0; const int i2 = 0;
i2 have the same type, which is a constant integer.
The "old" style is to put
const to the left of the type it modifies, as is done for
i2 above. This, however, is inconsisent:
const int i = 0; const int* const* p;
Here, when typing the declaration, one must remember to put the first
const on the left of the type it modifies, while putting sunsequent
consts to the right of the type that is modified. When reading the second declaration (from right-to-left),
const usually modifies what is on the left, but we have to backtrack and apply the last
const to the type "before" it.
Enter the consistent style:
const modifies the type on the left, always.
int const i = 0; int const* const* p;
Read from right-to-left. First one is a
const int. Second one is a pointer to
const pointer to
const int. Simple. We're done.
But some compilers have particular trouble when this is combined with template type parameters, especially when the types already have
const as their top-level qualifier. Oh well. When they catch up, we can rid ourselves completely of this inconsistent style.