Name lookup
Поиск имени — это процедура, с помощью которой имя , встречающееся в программе, связывается с объявлением , которое его ввело.
Например, для компиляции std:: cout << std:: endl ; компилятор выполняет:
-
неквалифицированный поиск имени
std, который находит объявление пространства имён std в заголовке <iostream> -
квалифицированный поиск имени
cout, который находит объявление переменной в пространстве имёнstd -
квалифицированный поиск имени
endl, который находит объявление шаблона функции в пространстве имёнstd -
как
поиск, зависимый от аргументов
для имени
operator<<, который находит несколько объявлений шаблонов функций в пространстве имёнstd, так и квалифицированный поиск имени std :: ostream :: operator << , который находит несколько объявлений функций-членов в классе std::ostream .
Для имён функций и шаблонов функций поиск имён может связывать несколько объявлений с одним именем и может получать дополнительные объявления с помощью поиска, зависимого от аргументов . Вывод шаблонных аргументов также может применяться, и набор объявлений передаётся в разрешение перегрузки , которое выбирает объявление, которое будет использоваться. Правила доступа к членам , если применимы, рассматриваются только после поиска имён и разрешения перегрузки.
Для всех остальных имён (переменных, пространств имён, классов и т.д.) поиск имени может ассоциировать несколько объявлений только если они объявляют одну и ту же сущность , иначе он должен выдавать единственное объявление для успешной компиляции программы. Поиск имени в области видимости находит все объявления этого имени, за одним исключением, известным как "struct hack" или "сокрытие тип/не-тип": В одной и той же области видимости некоторые вхождения имени могут ссылаться на объявление класса/структуры/объединения/перечисления, не являющегося typedef , тогда как все остальные вхождения того же имени либо ссылаются на одну и ту же переменную, нестатический член данных или перечислитель, либо все ссылаются на возможно перегруженные имена функций или шаблонов функций. В этом случае ошибки не возникает, но имя типа скрыто от поиска (код должен использовать уточнённый спецификатор типа для доступа к нему).
Типы поиска
Если имя появляется непосредственно справа от оператора разрешения области видимости
::
или возможно после
::
с последующим уточняющим ключевым словом
template
, см.
В противном случае, см.
-
- (что, для имён функций, включает Поиск, зависимый от аргументов )
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| CWG 2063 | C++98 | "struct hack" не применялся в области видимости класса (нарушает совместимость с C) | применён |
| CWG 2218 | C++98 |
поиск не-функциональных (шаблонных) имён не мог связывать
множественные объявления, даже если они объявляют одну и ту же сущность |
разрешён |
Смотрите также
- Область видимости
- Поиск, зависимый от аргументов (ADL)
- Вывод шаблонных аргументов
- Разрешение перегрузки
|
C documentation
для
Lookup and name spaces
|