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
何克勤 閱讀(385)
評論(0) 編輯 收藏 所屬分類:
C/C++