6.6. Qualifiers and derived types
Arrays, structures and unions are ‘derived from’ (contain) other types; none of them may be derived from incomplete types. This means that a structure or union cannot contain an example of itself, because its own type is incomplete until the declaration is complete. Since a pointer to an incomplete type is not itself an incomplete type, it can be used in the derivation of arrays, structures and unions.
If any of the types that these things are derived from are qualified with
const
or volatile
, they do not inherit
that qualification. This means that if a structure contains
a const
object, the structure itself is not qualified with
const and any non-const members can still be modified. This is what you
would expect. However, the Standard does says that if any derived type
contains a type that is qualified with const
(or recursively
any inner type does) then it is not modifiable—so a structure that
contains a const cannot be on the left-hand side of an assignment
operator.