Работает ли ADL с именованными лямбдами?

Скажем, у меня есть класс и именованная лямбда в одном пространстве имен.

namespace bla {
class X { /* ... */ };
static auto lambda = []( X param ){ /* ... */ };
}

Эта лямбда почти эквивалентна функции, которая была объявлена ​​встроенной. Но могу ли я назвать эту лямбду из другого несвязанного пространства имен, не упоминая пространство имен bla используя ADL (поиск, зависящий от аргумента, также называемый поиском Кенига)?

namespace blub {
void f() {
bla::X x;
lambda( x ); // Does this compile?
}
}

1

Решение

Лямбда — это не функция, а объект, который можно вызвать как функцию. Таким образом, он не получает функцию обработки, и его вызов не подлежит ADL.

7

Другие решения

Лямбда — это действительно объект, поэтому вопрос сводится к следующему:

Работает ли 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 не принесет никаких других функций в картину.

3

По вопросам рекламы [email protected]