Поиск, зависящий от аргументов: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
м опечатка
Нет описания правки
Строка 1: Строка 1:
'''Поиск, зависящий от аргументов''' ({{lang-en|argument-depend lookup, ADL}}) или '''поиск Кёнига''' — формальный набор правил языка [[C++]] для поиска неквалифицированных имён функций и операторов при их вызове, включая вызовы [[Перегрузка процедур и функций|перегруженных функций]] и функций, определённых в различных [[Пространство имён (программирование)|пространствах имён]]<ref>[https://en.cppreference.com/ruwiki/w/cpp/language/adl Argument-dependent lookup] cppreference.com</ref>. Его появление связывают с именем американского программиста Эндрю Кёнига{{sfn|Lischner|2003|loc=Argument-Depend Name Lookup|p=21}}.
'''Поиск, зависящий от аргументов''' ({{lang-en|argument-depend lookup, ADL}}) или '''поиск Кёнига''' — формальный набор правил языка [[C++]] для поиска неквалифицированных имён функций и операторов при их вызове, включая вызовы [[Перегрузка процедур и функций|перегруженных функций]] и функций, определённых в различных [[Пространство имён (программирование)|пространствах имён]]<ref>[https://en.cppreference.com/ruwiki/w/cpp/language/adl Argument-dependent lookup] cppreference.com</ref>. Его появление связывают с именем американского программиста Эндрю Кёнига{{sfn|Lischner|2003|loc=Argument-Depend Name Lookup|p=21}}.


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


Определение множества связанных пространств имён и связанных классов для поиска ''ADL'' регламентируется следующими правилами{{sfn|Вандевурд|loc=Поиск, зависящий от аргументов|с=266}}:
Определение множества связанных пространств имён и связанных классов для поиска ''ADL'' регламентируется следующими правилами{{sfn|Вандевурд|loc=Поиск, зависящий от аргументов|с=266}}:

Версия от 12:16, 19 ноября 2019

Поиск, зависящий от аргументов (англ. 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 cppreference.com
  2. Lischner, 2003, Argument-Depend Name Lookup, p. 21.
  3. 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.