Описание тега argument-dependent-lookup
Неквалифицированный вызов функции, такой как 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 иногда называют "поиском Кенига" в честь Эндрю Кенига, который предложил эту функцию.