Namespaces
Variants

Name lookup

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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

Например, для компиляции 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 поиск не-функциональных (шаблонных) имён не мог связывать
множественные объявления, даже если они объявляют одну и ту же сущность
разрешён

Смотрите также

C documentation для Lookup and name spaces