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;
Both i
and 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 const
s 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.
:-)