Форма поиска имени в C++, который позволяет именам функций быть найденными в пространствах имен, связанных с аргументами, используемыми в вызове функции.
Неполный вызов функции такой как func(a, b, c)
будет поиск имя func
в пространствах имен, которые связаны с типами аргументов a
, b
и c
. Например, если a
имеет тип ns::A
и функция ns::func
существует затем, это может быть найдено зависимым поиском аргумента и будет добавлено к набору перегрузки, используемому для разрешения вызова.
Причина этой функции состоит в том, чтобы позволить перегруженные операторы, которые, как объявляют в пространствах имен, были найдены, потому что операторы не могут быть квалифицированы пространством имен, например.
namespace ns { struct A { }; A operator+(const A&, const A&); } void f(ns::A a1, ns::A a2) { ns::A sum = a1 + a2; // must find ns::operator+ }
В примере выше +
оператор должен найти ns::operator+
, но без ADL это не было бы.
ADL позволяет естественное a1 + a2
синтаксис для работы как ожидалось, вместо того, чтобы иметь необходимость записать что-то как a2 ns::+ a2
, который не является допустимым синтаксисом, или ns::operator+(a1, a2)
.
ADL иногда известен как "Поиск Koenig" после Andrew Koenig, который предложил функцию.