Что происходит при появлении 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
    }
};
Другие вопросы по тегам