Поиск имени
Поиск имени, это процедура, с помощью которой имя, когда оно встречается в программе, связывается с объявлением, которое его ввело.
Например, для компиляции std::cout << std::endl;, компилятор выполняет:
- поиск неполного имени для имени
std, который находит объявление пространства имён std в заголовке<iostream> - поиск полного имени для имени
cout, который находит объявление переменной в пространстве имёнstd - поиск полного имени для имени
endl, который находит объявление шаблона функции в пространстве имёнstd - поиск, зависящий от аргументов для имени
operator <<, который находит несколько объявлений шаблонов функций в пространстве имёнstd, и поиск полного имени для имениstd::ostream::operator<<, который находит несколько объявлений функций-элементов в классе std::ostream
Для имён функций и шаблонов функций поиск имени может связать несколько объявлений с одним и тем же именем и может получить дополнительные объявления из поиска, зависящего от аргументов. Вывод аргументов шаблона также может применяться, и набор объявлений передаётся в разрешение перегрузки, которое выбирает объявление для использования. Правила доступа к элементам, если применимы, рассматриваются только после поиска имени и разрешения перегрузки.
Для всех других имён (переменных, пространств имён, классов и т.д.) при поиске имён можно связать несколько объявлений, только если они объявляют одну и ту же сущность, в противном случае он должен создать одно объявление, чтобы программа могла работать. компилировать. Поиск имени в области видимости находит все объявления этого имени, за одним исключением, известным как "взлом структуры" или "скрытие типа/не типа": В пределах той же области видимости некоторые вхождения имени могут относиться к объявлению класса/структуры/объединения/перечисления, которое не является typedef, в то время как все другие вхождения с тем же именем либо все относятся к одной и той же переменной, нестатическому элементу данных (начиная с C++14) или перечислителю, либо все они относятся к возможно перегруженным функциям или именам шаблонов функций. В этом случае ошибки нет, но имя типа скрыто от поиска (код должен использовать подробный спецификатор типа для доступа к нему).
Типы поиска
Если имя появляется сразу справа от оператора разрешения области видимости :: или, возможно, после ::, за которым следует ключевое слово устранения неоднозначности template, смотрите
В противном случае смотрите
- (который для имён функций включает Поиск, зависящий от аргументов)
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| CWG 2063 | C++98 | "структурный хак" не применялся в области класса (нарушает совместимость с C) | применяется |
| CWG 2218 | C++98 | поиск имён, не являющихся функциями (шаблонами), не может связать несколько объявлений, даже если они объявляют одну и ту же сущность |
позволено |
Смотрите также
Документация C по Поиск и пространства имён
|