Firstly, sample codes:
Case 1:
typedef char* CHARS;
typedef CHARS const CPTR; // constant pointer to chars
Textually replacing CHARS becomes:
typedef char* const CPTR; // still a constant pointer to chars
Case 2:
typedef char* CHARS;
typedef const CHARS CPTR; // constant pointer to chars
Textually replacing CHARS becomes:
typedef const char* CPTR; // pointer to constant chars
In case 2, after textually replacing CHARS, the meaning of the typedef changed. Why is this so? How does C++ interpret this definition?
There’s no point in analyzing
typedefbehavior on the basis of textual replacement. Typedef-names are not macros, they are not replaced textually.As you noted yourself
is the same thing as
This is so for the very same reason why
has the same meaning as
Typedef-name don’t define new types (only aliases to existing ones), but they are “atomic” in a sense that any qualifiers (like
const) apply at the very top level, i.e. they apply to the entire type hidden behind the typedef-name. Once you defined a typedef-name, you can’t “inject” a qualifier into it so that it would modify any deeper levels of the type.