Скажем, у меня есть класс и именованная лямбда в одном пространстве имен.
namespace bla {
class X { /* ... */ };
static auto lambda = []( X param ){ /* ... */ };
}
Эта лямбда почти эквивалентна функции, которая была объявлена встроенной. Но могу ли я назвать эту лямбду из другого несвязанного пространства имен, не упоминая пространство имен bla
используя ADL (поиск, зависящий от аргумента, также называемый поиском Кенига)?
namespace blub {
void f() {
bla::X x;
lambda( x ); // Does this compile?
}
}
Лямбда — это не функция, а объект, который можно вызвать как функцию. Таким образом, он не получает функцию обработки, и его вызов не подлежит ADL.
Лямбда — это действительно объект, поэтому вопрос сводится к следующему:
Работает ли ADL для объектов?
И очевидный ответ, что это не так, ADL только добавит функции на набор кандидатов для разрешения перегрузки. Также обратите внимание, что если при обычном поиске будет найдено что-то кроме функции, ADL не добавит никаких кандидатов в набор разрешений перегрузки.
namespace A {
struct S { operator int() const { return 0; } };
void f(S const &) { std::cout << "A::f\n"; }
}
auto f = [](int) { std::cout << "lambda\n"; }
namespace B {
void test() {
::A::S s;
f(s); // prints lambda
}
}
В то время как A::f
лучше соответствует вызову, чем ::f
, так как ::f
найден поиском и это не функция, ADL не принесет никаких других функций в картину.