Поиск имени
Поиск имени — это процедура, посредством которой имя, встреченное в программе, связывается с объявлением, которое его ввело.
Например, чтобы скомпилировать std::cout << std::endl;, компилятор выполняет:
- поиск неквалифицированного имени
std, при котором находится объявление пространства имён std в заголовке<iostream> - поиск квалифицированного имени
cout, при котором находится объявление переменной в пространстве имёнstd - поиск квалифицированного имени
endl, при котором находится объявление шаблона функции в пространстве имёнstd - как поиск, зависящий от аргументов, для имени
operator<<, при котором находится несколько объявлений шаблонов функций в пространстве имёнstd, так и поиск квалифицированного имениstd::ostream::operator<<, при котором находится несколько объявлений функций-членов в классеstd::ostream.
Для имён функций и шаблонов функций поиск имени может связать несколько объявлений с одним и тем же именем, а также получить дополнительные объявления с помощью поиска, зависящего от аргументов. Также может применяться выведение аргументов шаблона, после чего набор объявлений передаётся в разрешение перегрузки, которое выбирает используемое объявление. Правила доступа к членам, если применимо, учитываются только после поиска имени и разрешения перегрузки.
Для всех остальных имён (переменных, пространств имён, классов и т. д.) поиск имени может связать несколько объявлений только в том случае, если они объявляют одну и ту же сущность; в противном случае для компиляции программы должно быть найдено одно объявление. Поиск имени в области видимости находит все объявления с этим именем, за одним исключением, известным как «хак со struct» или «скрытие типа нетипом»: в одной и той же области видимости некоторые вхождения имени могут ссылаться на объявление класса/структуры/объединения/перечисления, которое не является typedef, тогда как все остальные вхождения того же имени либо ссылаются на одну и ту же переменную, нестатический член данных или перечислитель, либо на имена функций или шаблонов функций, которые могут быть перегружены. В этом случае ошибки нет, но имя типа скрыто от поиска (для доступа к нему в коде необходимо использовать уточнённый спецификатор типа).
Виды поиска
Если имя находится непосредственно справа от оператора разрешения области видимости :: или, возможно, после ::, за которым следует ключевое слово для устранения неоднозначности template, см.
В противном случае см.
- Поиск неквалифицированного имени
- (который для имён функций включает поиск, зависящий от аргументов)
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроспективно к ранее опубликованным стандартам C++.
| DR | Применён к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| CWG 2063 | C++98 | «Хак со struct» не применялся в области видимости класса (нарушалась совместимость с C) | применяется |
| CWG 2218 | C++98 | поиск имён, не являющихся именами функций (шаблонов), не мог связывать несколько объявлений, даже если они объявляют одну и ту же сущность | разрешено |
См. также
- Область видимости
- Поиск, зависящий от аргументов (ADL)
- Выведение аргументов шаблона
- Разрешение перегрузки
| Документация по C для Поиск и пространства имён |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/lookup