0

這編譯:名稱查找的煩惱與基本面和用戶定義類型

struct type{}; 

template<typename T> 
void foo(T in) { bar(in, type()); } 

void bar(int, const type&) {} 
int main() { foo(42); } 

這並不(正如我在previous question from today教訓):

template<typename T> 
void foo(T in) { bar(in); } 

void bar(int) {} 
int main() { foo(42); } 

是第一個片段也編譯的原因與ADL解釋?如果是這樣,怎麼樣?

模板參數是基本類型,ADL不應該爲它工作...爲什麼使用類型type有什麼區別?

回答

2

儘管在具體的專業in是基本類型,bar仍然是一個獨立的名稱,因此它的查找的參數依賴部分是在實例化上下文中執行的。事實上,使它依賴的參數沒有關聯的名稱空間是無關緊要的。所有非依賴的參數仍然有助於關聯的命名空間和類的集合。