ADL法则(koenig lookup)
argument dependent lookup(ADL)法则也叫koenig lookup法则。
什么是ADL,我们先看一个有趣的例子:
#include <iostream> using namespace std; namespace A { struct X{}; void g(X) { cout << "A...\n"; } } int main() { A::X x; A::g(x); }
运行显示A...
如果去掉main中的A::, 你以为编译一定会报错,函数g未定义
然而并不会,结果仍显示A...
这就是ADL也搞事情了,规则是这样的:当编译器在编译该函数时,不仅会在current scope 和global scope查找函数,并且会在形参声明的地方查找函数。
因为形参x在命名空间A中声明的,于是编译器会在A中查找g,找到了!
另外:
1. ADL只对namespace起作用,把namespace A换成class A就会报错。
2. 编译器查找是有优先顺序的,current scope > global scope > 使用ADL,一旦找到便停止。