Поиск, зависящий от аргументов: различия между версиями
[отпатрулированная версия] | [отпатрулированная версия] |
Нет описания правки |
Добавление ссылок на электронные версии книг (20240723)) #IABot (v2.0.9.5) (GreenC bot |
||
(не показано 9 промежуточных версий 6 участников) | |||
Строка 1: | Строка 1: | ||
'''Поиск, зависящий от аргументов''' ({{lang-en|argument-depend lookup, ADL}}) или '''поиск Кёнига''' — формальный набор правил языка [[C++]] для поиска неквалифицированных имён функций и операторов при их вызове, включая вызовы [[Перегрузка процедур и функций|перегруженных |
'''Поиск, зависящий от аргументов''' ({{lang-en|argument-depend lookup, ADL}}) или '''поиск Кёнига''' — формальный набор правил языка [[C++]] для поиска неквалифицированных имён функций и операторов при их вызове, включая вызовы [[Перегрузка процедур и функций|перегруженных функций]] и функций, определённых в различных [[Пространство имён (программирование)|пространствах имён]]<ref>[https://en.cppreference.com/ruwiki/w/cpp/language/adl Argument-dependent lookup] {{Wayback|url=https://en.cppreference.com/ruwiki/w/cpp/language/adl |date=20190308002942 }} cppreference.com</ref>. Его появление связывают с именем американского программиста Эндрю Кёнига{{sfn|Lischner|2003|loc=Argument-Depend Name Lookup|p=21}}. |
||
Поиск, зависящий от аргументов не применяется, если обычный поиск имени способен найти имя переменной, функции-члена, [[тип данных|типа данных]] или имя объявления функции с областью видимости в виде программного блока. Его также запрещёно использовать, если имя вызываемой функции заключено в круглые скобки. В противоположность этому, если после имени функции следует список аргументов в круглых скобках, то поиск ''ADL'' осуществляется путём поиска имени в пространствах имён и классах, ассоциированных (связанных) с именами типов параметров вызываемой функции. Например, если тип данных параметра является [[Указатель (тип данных)|указателем]] на класс ''X'', то отыскивание имени будет вестись в пространстве имён класса ''X'' и во всех пространствах имён и классов, которым принадлежит ''Х''{{sfn|Вандевурд|loc=Поиск, зависящий от аргументов|с=266}}. |
Поиск, зависящий от аргументов, не применяется, если обычный поиск имени способен найти имя переменной, функции-члена, [[тип данных|типа данных]] или имя объявления функции с областью видимости в виде программного блока. Его также запрещёно использовать, если имя вызываемой функции заключено в круглые скобки. В противоположность этому, если после имени функции следует список аргументов в круглых скобках, то поиск ''ADL'' осуществляется путём поиска имени в пространствах имён и классах, ассоциированных (связанных) с именами типов параметров вызываемой функции. Например, если тип данных параметра является [[Указатель (тип данных)|указателем]] на класс ''X'', то отыскивание имени будет вестись в пространстве имён класса ''X'' и во всех пространствах имён и классов, которым принадлежит ''Х''{{sfn|Вандевурд|2018|loc=Поиск, зависящий от аргументов|с=266}}. |
||
Определение множества связанных пространств имён и связанных классов для поиска ''ADL'' регламентируется следующими правилами{{sfn|Вандевурд|loc=Поиск, зависящий от аргументов|с=266}}: |
Определение множества связанных пространств имён и связанных классов для поиска ''ADL'' регламентируется следующими правилами{{sfn|Вандевурд|2018|loc=Поиск, зависящий от аргументов|с=266}}: |
||
# Для всех встроенных типов это — пустое множество. |
# Для всех встроенных типов это — пустое множество. |
||
Строка 11: | Строка 11: | ||
# Для всех типов классов (включая [[Объединение (структура данных)|объединения]]) множеством связанных классов является сам тип класса, его охватывающий класс, а также все непосредственные или опосредованные [[базовый класс|базовые классы]]. Множество связанных пространств имён представляет собой пространства имён, в которых объявлены связанные классы. Если класс является экземпляром [[Шаблоны C++|параметризованного класса]] (шаблона), то сюда включаются и типы аргументов типов шаблона, а также классы и пространства имен, в которых объявлены шаблонные аргументы шаблона. |
# Для всех типов классов (включая [[Объединение (структура данных)|объединения]]) множеством связанных классов является сам тип класса, его охватывающий класс, а также все непосредственные или опосредованные [[базовый класс|базовые классы]]. Множество связанных пространств имён представляет собой пространства имён, в которых объявлены связанные классы. Если класс является экземпляром [[Шаблоны C++|параметризованного класса]] (шаблона), то сюда включаются и типы аргументов типов шаблона, а также классы и пространства имен, в которых объявлены шаблонные аргументы шаблона. |
||
# Для типов функций множества связанных пространств имён и классов включают пространства имен и классы, связанные со всеми типами параметров функций, а также связанные с типами возвращаемых значений. |
# Для типов функций множества связанных пространств имён и классов включают пространства имен и классы, связанные со всеми типами параметров функций, а также связанные с типами возвращаемых значений. |
||
# Для указателей на члены класса ''X'' множества связанных пространств имени классов включают пространства имён и классы, связанные с ''X'' в дополнение к связанным с типом члена класса (если это тип указателя на функцию-член, то учитываются также типы параметров и возвращаемых значений этой функции-члена) |
# Для указателей на члены класса ''X'' множества связанных пространств имени классов включают пространства имён и классы, связанные с ''X'' в дополнение к связанным с типом члена класса (если это тип указателя на функцию-член, то учитываются также типы параметров и возвращаемых значений этой функции-члена). |
||
== Примечания == |
== Примечания == |
||
Строка 46: | Строка 46: | ||
| заглавие = C++ In a Nutshell: A Desktop Quick Reference |
| заглавие = C++ In a Nutshell: A Desktop Quick Reference |
||
| оригинал = |
| оригинал = |
||
| ссылка = |
| ссылка = https://archive.org/details/cinnutshell0000lisc |
||
| викитека = |
| викитека = |
||
| ответственный = |
| ответственный = |
Текущая версия от 01:39, 25 июля 2024
Поиск, зависящий от аргументов (англ. argument-depend lookup, ADL) или поиск Кёнига — формальный набор правил языка C++ для поиска неквалифицированных имён функций и операторов при их вызове, включая вызовы перегруженных функций и функций, определённых в различных пространствах имён[1]. Его появление связывают с именем американского программиста Эндрю Кёнига[2].
Поиск, зависящий от аргументов, не применяется, если обычный поиск имени способен найти имя переменной, функции-члена, типа данных или имя объявления функции с областью видимости в виде программного блока. Его также запрещёно использовать, если имя вызываемой функции заключено в круглые скобки. В противоположность этому, если после имени функции следует список аргументов в круглых скобках, то поиск ADL осуществляется путём поиска имени в пространствах имён и классах, ассоциированных (связанных) с именами типов параметров вызываемой функции. Например, если тип данных параметра является указателем на класс X, то отыскивание имени будет вестись в пространстве имён класса X и во всех пространствах имён и классов, которым принадлежит Х[3].
Определение множества связанных пространств имён и связанных классов для поиска ADL регламентируется следующими правилами[3]:
- Для всех встроенных типов это — пустое множество.
- Для массивов и указателей — это пространства имён и классы лежащего в их основе типа. То есть, того типа данных, который является типом элемента массива или на который указывает указатель.
- Для перечисляемых типов enum связанным пространством имён является пространство имен, в котором объявлено перечисление.
- Для всех членов классов связанным классом является охватывающий их класс.
- Для всех типов классов (включая объединения) множеством связанных классов является сам тип класса, его охватывающий класс, а также все непосредственные или опосредованные базовые классы. Множество связанных пространств имён представляет собой пространства имён, в которых объявлены связанные классы. Если класс является экземпляром параметризованного класса (шаблона), то сюда включаются и типы аргументов типов шаблона, а также классы и пространства имен, в которых объявлены шаблонные аргументы шаблона.
- Для типов функций множества связанных пространств имён и классов включают пространства имен и классы, связанные со всеми типами параметров функций, а также связанные с типами возвращаемых значений.
- Для указателей на члены класса X множества связанных пространств имени классов включают пространства имён и классы, связанные с X в дополнение к связанным с типом члена класса (если это тип указателя на функцию-член, то учитываются также типы параметров и возвращаемых значений этой функции-члена).
Примечания
[править | править код]- ↑ Argument-dependent lookup Архивная копия от 8 марта 2019 на Wayback Machine cppreference.com
- ↑ Lischner, 2003, Argument-Depend Name Lookup, p. 21.
- ↑ 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.