1

假设我在一个命名空间中有一个类和一个命名的 lambda。

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

此 lambda 几乎等同于已声明为内联的函数。但是我可以从另一个不相关的命名空间调用那个 lambda,而不bla使用 ADL(参数相关查找,也称为 Koenig 查找)提及命名空间吗?

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

2 回答 2

7

lambda 不是函数,而是可以像函数一样调用的对象。因此,它没有得到函数处理,并且它的调用不受 ADL 的约束。

于 2013-06-21T13:47:49.487 回答
3

lambda 实际上是一个对象,所以问题归结为:

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 不会将任何其他函数带入图片中。

于 2013-06-21T14:00:59.347 回答