Поиск, зависящий от аргументов
Поиск, зависящий от аргументов (англ. argument-depend lookup, ADL) или поиск Кёнига — формальный набор правил языка C++ для поиска неквалифицированных имён функций и операторов при их вызове, включая вызовы перегруженных функций и функций, определённых в различных пространствах имён[1]. Его появление связывают с именем американского программиста Эндрю Кёнига[2].
Поиск, зависящий от аргументов, не применяется, если обычный поиск имени способен найти имя переменной, функции-члена, типа данных или имя объявления функции с областью видимости в виде программного блока. Его также запрещёно использовать, если имя вызываемой функции заключено в круглые скобки. В противоположность этому, если после имени функции следует список аргументов в круглых скобках, то поиск ADL осуществляется путём поиска имени в пространствах имён и классах, ассоциированных (связанных) с именами типов параметров вызываемой функции. Например, если тип данных параметра является указателем на класс X, то отыскивание имени будет вестись в пространстве имён класса X и во всех пространствах имён и классов, которым принадлежит Х[3].
Определение множества связанных пространств имён и связанных классов для поиска ADL регламентируется следующими правилами[3]:
- Для всех встроенных типов это — пустое множество.
- Для массивов и указателей — это пространства имён и классы лежащего в их основе типа. То есть, того типа данных, который является типом элемента массива или на который указывает указатель.
- Для перечисляемых типов enum связанным пространством имён является пространство имен, в котором объявлено перечисление.
- Для всех членов классов связанным классом является охватывающий их класс.
- Для всех типов классов (включая объединения) множеством связанных классов является сам тип класса, его охватывающий класс, а также все непосредственные или опосредованные базовые классы. Множество связанных пространств имён представляет собой пространства имён, в которых объявлены связанные классы. Если класс является экземпляром параметризованного класса (шаблона), то сюда включаются и типы аргументов типов шаблона, а также классы и пространства имен, в которых объявлены шаблонные аргументы шаблона.
- Для типов функций множества связанных пространств имён и классов включают пространства имен и классы, связанные со всеми типами параметров функций, а также связанные с типами возвращаемых значений.
- Для указателей на члены класса X множества связанных пространств имени классов включают пространства имён и классы, связанные с X в дополнение к связанным с типом члена класса (если это тип указателя на функцию-член, то учитываются также типы параметров и возвращаемых значений этой функции-члена).
Примечания
- ↑ Argument-dependent lookup cppreference.com
- ↑ Lischner, 2003, Argument-Depend Name Lookup, p. 21.
- ↑ 1 2 Вандевурд, Поиск, зависящий от аргументов, с. 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.