Поиск, зависящий от аргументов

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Поиск, зависящий от аргументов (англ. argument-depend lookup, ADL) или поиск Кёнига — формальный набор правил языка C++ для поиска неквалифицированных имён функций и операторов при их вызове, включая вызовы перегруженных функций и функций, определённых в различных пространствах имён[1]. Его появление связывают с именем американского программиста Эндрю Кёнига[2].

Поиск, зависящий от аргументов, не применяется, если обычный поиск имени способен найти имя переменной, функции-члена, типа данных или имя объявления функции с областью видимости в виде программного блока. Его также запрещёно использовать, если имя вызываемой функции заключено в круглые скобки. В противоположность этому, если после имени функции следует список аргументов в круглых скобках, то поиск ADL осуществляется путём поиска имени в пространствах имён и классах, ассоциированных (связанных) с именами типов параметров вызываемой функции. Например, если тип данных параметра является указателем на класс X, то отыскивание имени будет вестись в пространстве имён класса X и во всех пространствах имён и классов, которым принадлежит Х[3].

Определение множества связанных пространств имён и связанных классов для поиска ADL регламентируется следующими правилами[3]:

  1. Для всех встроенных типов это — пустое множество.
  2. Для массивов и указателей — это пространства имён и классы лежащего в их основе типа. То есть, того типа данных, который является типом элемента массива или на который указывает указатель.
  3. Для перечисляемых типов enum связанным пространством имён является пространство имен, в котором объявлено перечисление.
  4. Для всех членов классов связанным классом является охватывающий их класс.
  5. Для всех типов классов (включая объединения) множеством связанных классов является сам тип класса, его охватывающий класс, а также все непосредственные или опосредованные базовые классы. Множество связанных пространств имён представляет собой пространства имён, в которых объявлены связанные классы. Если класс является экземпляром параметризованного класса (шаблона), то сюда включаются и типы аргументов типов шаблона, а также классы и пространства имен, в которых объявлены шаблонные аргументы шаблона.
  6. Для типов функций множества связанных пространств имён и классов включают пространства имен и классы, связанные со всеми типами параметров функций, а также связанные с типами возвращаемых значений.
  7. Для указателей на члены класса X множества связанных пространств имени классов включают пространства имён и классы, связанные с X в дополнение к связанным с типом члена класса (если это тип указателя на функцию-член, то учитываются также типы параметров и возвращаемых значений этой функции-члена).

Примечания

[править | править код]
  1. Argument-dependent lookup Архивная копия от 8 марта 2019 на Wayback Machine cppreference.com
  2. Lischner, 2003, Argument-Depend Name Lookup, p. 21.
  3. 1 2 Вандевурд, 2018, Поиск, зависящий от аргументов, с. 266.
  • Д. Вандевурд, Н. Джосаттис, Д. Грегор. Шаблоны C++. Справочник разработчика = C++ Templates. The Complete Guide. — 2-е. — СПб. : «Альфа-книга», 2018. — 848 с. — ISBN 978-5-9500296-8-4.
  • R. Lischner. C++ In a Nutshell: A Desktop Quick Reference. — O'Reilly Media Inc., 2003. — ISBN 978-0596-00298-5.