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,一旦找到便停止。

 

posted @ 2020-08-31 11:11  IceArrow  阅读(611)  评论(0编辑  收藏  举报