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