考慮這個樣品中http://en.cppreference.com/w/cpp/language/adl描述:C++普通查找VS參數依賴查找
namespace A {
struct X;
struct Y;
void f(int);
void g(X);
}
namespace B {
void f(int i) {
f(i); // calls B::f (endless recursion)
}
void g(A::X x) {
g(x); // Error: ambiguous between B::g (ordinary lookup)
// and A::g (argument-dependent lookup)
}
void h(A::Y y) {
h(y); // calls B::h (endless recursion): ADL examines the A namespace
// but finds no A::h, so only B::h from ordinary lookup is used
}
}
我很奇怪,爲什麼不確定性出現,因爲ADL規則沒有考慮到如果
「查找由通常的不合格查找產生的集合包含以下任何一個「。
這裏B ::克可通過如在http://en.cppreference.com/w/cpp/language/unqualified_lookup感謝解釋規則
對於在函數的定義中使用的名稱,或者在其主體或作爲其一部分不合格查找中找到默認參數,其中函數是用戶聲明或全局名稱空間的成員,在使用名稱之前搜索使用名稱的塊,然後在該塊的開始之前搜索封閉塊等,直到到達作爲功能體的塊。然後在該函數的聲明的名稱空間中搜索,直到使用的名稱,然後封閉命名空間的函數的定義(不一定是報關)等
然後我的問題是,爲什麼ADL認爲規則在這種情況下?
你能詳細說明爲什麼你認爲它不應該被考慮在內嗎? – cpplearner
首先,如果由通常的非限定查找產生的查找集包含以下任何一項,則不考慮依賴於參數的查找: – FlashMcQueen
1)類成員的聲明 2)塊範圍的函數聲明(這不是使用聲明) 3)任何不是函數或函數模板的聲明(例如,函數對象或其名稱與正在查找的函數的名稱相沖突的變量) – FlashMcQueen