ADL是否与命名的lambdas一起使用?

时间:2013-06-21 13:42:15

标签: c++ c++11 lambda argument-dependent-lookup

假设我在一个名称空间中有一个类和一个名为lambda的文件。

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

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

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

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分: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赢了' t将任何其他功能纳入图片。