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

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая WikiCyberMan (обсуждение | вклад) в 12:07, 7 марта 2019. Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску

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

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

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

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

Примечания

  1. Argument-dependent lookup cppreference.com
  2. 1 2 Вандевурд, Поиск, зависящий от аргументов, с. 266.

Источники

  • Д. Вандевурд, Н. Джосаттис, Д. Грегор. Шаблоны C++. Справочник разработчика = C++ Templates. The Complete Guide. — 2-е. — СПб. : «Альфа-книга», 2018. — 848 с. — ISBN 978-5-9500296-8-4.