Вопрос на самом деле о том, когда именно имя переменной определяется как идентификатор, и язык определяет, что оно находится сразу после точки в коде, где объявлена переменная:
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.
}
Существуют аналогичные правила в других контекстах, и это просто вопрос принятия решения, когда идентификаторы объявлены. Существуют и другие подобные ситуации, например, в списке инициализации класса:
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
{};
};
Или в области действия идентификаторов при определении функций-членов:
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.
{}
Что касается обоснования решения, я не могу вам сказать, но оно последовательное и простое.