Spec-Zone.ru › C++

Поиск имен

Поиск имени — это процедура, посредством которой имя, встреченное в программе, связывается с объявлением, которое его ввело.

Например, для компиляции 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API