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

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

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

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

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

2 ответа

Решение

Лямбда - это не функция, а объект, который можно вызвать как функцию. Как таковой, он не получает функцию обработки и его вызов не подлежит 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 не принесет никаких других функций в картину.

Другие вопросы по тегам