La question est de savoir quand un nom de variable est définie comme un identifiant, et la langue détermine qu'il est à droite après le point dans le code où la variable est déclarée:
typedef int type;
int main() {
type t; // type refers to ::type
int // type still refers to ::type
type; // variable declared, this shadows ::type
type + 1; // type is a variable of type int.
}
Il y a des règles similaires dans d'autres contextes, et c'est juste une question de décider quand les identificateurs sont déclarées. Il y a d'autres situations similaires, par exemple dans la liste d'initialisation d'une classe:
struct test {
int x; // declare member
test( int x ) // declare parameter (shadows member)
: x( // refers to member (parameter is not legal here)
x ) // refers to parameter
{};
};
Ou dans le champ d'application de la identificateurs dans la définition des fonctions membres:
struct test {
typedef int type;
type f( type );
};
test::type // qualification required, the scope of the return type is
// at namespace level
test::f(
type t ) // but the scope of arguments is the class, no qualification
// required.
{}
Que de la justification de la décision, je ne peux pas vous dire, mais il est cohérent et simple.