ADL(Koenig) 查找
ADL ,参数相关查找,也称作为 Koenig 查找(以 Andrew Koenig 的名字命名),是指在编译器对无限定域的函数调用进行名字查找时,所应用的一种查找规则。
首先来看一个函数所在的域的分类:
1 :类域(函数作为某个类的成员函数(静态或非静态))
2 :名字空间域
3 :全局域
而 Koenig 查找,它的规则就是当编译器对无限定域的函数调用进行名字查找时,除了当前名字空间域以外,也会把函数参数类型所处的名字空间 加入查找的范围。
ADL 就是为了确保使用类型 X 的对象 x 时能够像使用 X 的成员函数一样简单 (ensure that code that uses an object x of type X can use its nonmember function interface as easily as it can use member functions) 。
根据 ADL 规则,如果非成员函数想和类型一起被使用,应该将它们置于同一个名字空间中。换句话说,和类型 X 放在同一名字空间下的非成员函数,也是 X 接口的一部分。 ( 常见的有 <<or>> 操作符 )
示例:
#include <iostream>
//class N // 类域
//{
//public :
// enum E {e1};
// void f(E)
// {
// std::cout << "N::f(N::E) called\n";
// }
//};
namespace N{ // 名字空间域
enum E {e1};
void f(E){
std::cout << "N::f(N::E) called\n";
}
}
void f(int)
{
std::cout << " ::f(int) called\n";
}
int main()
{
::f(N::e1); // 受限函数,禁用 ADL // 输出 ::f(int) called
f(N::e1); // 普通查找到 f();
return 0;
}
上述例子,如果 N 为 class ,输出为: ::f(int) called ;如果 N 为名字空间,输出: N::f(N::E) called 。
也就是说 ADL 仅会将参数所在的名字空间中的函数名字加入查找范围。
调用函数时,显式地限定名字空间将禁用 ADL 查找 ,加快解析过程。
Argument Dependent Lookup (ADL)解析
ADL,参数相关查找,也称作为Koenig查找(以Andrew Koenig的名字命名,有兴趣可以看Scott Meyer的文章The Most Important C++ People...Ever),是指在编译器对无限定域的函数调用进行名字查找时,所应用的一种查找规则。
f(x, y, z); // unqualified
N::f(x, y, z); // qualified
上面的函数调用,第一个f就是无限定域的函数调用,第二个则限定了在名字空间N里面,也是说使用了完全限定名。
我们首先来看一个函数所在的域的分类:
1:类域(函数作为某个类的成员函数(静态或非静态))
2:名字空间域
3:全局域
而Koenig查找,它的规则就是当编译器对无限定域的函数调用进行名字查找时,除了当前名字空间域以外,也会把函数参数类型所处的名字空间加入查找的范围。
Herb提供的解释(Exceptional C++, Item 31)
Koenig Lookup(simplified): If you supply a function argument of class type (here x, of type A::X), then to look up the correct function name the compiler considers matching names in the namespace (here A) containing the argument's type.
请看下面的例程:
posted on 2009-12-13 11:37
何克勤 阅读(373)
评论(0) 编辑 收藏 所属分类:
C/C++