Согласно https://en.cppreference.com/w/cpp/language/injected-class-name
В области класса имя текущего класса обрабатывается так, как если бы оно было общедоступным именем члена; это называется имя-внедренного-класса. Точка объявления имени находится сразу после открывающей скобки определения класса.
int X;
struct X {
void f() {
X* p; // OK. X refers to the injected-class-name
::X* q; // Error: name lookup finds a variable name, which hides the struct name
}
};
Так что же на самом деле происходит в коде? X* p
превратилось в X::X* p
?