假设我在一个名称空间中有一个类和一个名为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?
}
}
答案 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将任何其他功能纳入图片。