Что происходит при появлении Injected-Class-Name? (C++)
Согласно 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
?
2 ответа
Так что же на самом деле происходит в коде? X* p превратился в
X::X*
п?
В принципе. Правила поиска по имени начинаются с самого узкого диапазона. Когда ты делаешьX* p;
в f
смотрит в f
область видимости и ничего не находит. Затем он проверяетX
объем с тех пор f
ограничен X
. НаходитX
поскольку он вводится в область класса, поэтому он останавливается на этом, и вы получаете тип класса.
Когда ты делаешь ::X* q;
тогда ::X
говорит искать X
в глобальном пространстве имен и находит переменную, а не тип, поэтому вы получаете сообщение об ошибке.
Это полное имя ::X
ищется в глобальном пространстве имен. Поскольку нет типа с таким именем (объявление переменной скрывает типstruct X
) компилятор выдает ошибку.
Вы можете использовать подробное имя, например
int X;
struct X {
void f() {
X* p; // OK. X refers to the injected-class-name
struct ::X* q; // OK. elaborated name struct ::X
}
};