2013-02-06 65 views
7

這是來自Does argument dependent lookup only search namespaces or classes too?的後續問題,其中@DavidRodríguez表示「ADL將在該類型的封閉名稱空間中查找,並且裏面的類型本身也是」。我可能把他錯了什麼,他想說,但我是想這個例子:不ADL查找靜態成員函數?

struct foo{ 
    static void bar(foo* z){}  
}; 

int main(){ 
    foo* z; 
    bar(z); 
} 

它不會編譯,生成錯誤「‘巴’不是在這個範圍內聲明」。 ADL是否不考慮靜態成員函數?我的意思是在相關的例子中是foo,所以ADL不會在類裏面看? 。任何人都可以在這裏簡化規則嗎?

+1

Bump ...發佈的答案沒有解決爲什麼ADL在此代碼中找不到「bar」的問題,它會轉而討論朋友函數 –

回答

6

他大概意思是:

struct foo{ 
    friend void bar(foo* z){} //not static, its friend now 
}; 

foo* z; 
bar(z); //fine now 

但隨後在技術上bar()foo。在foo的封閉命名空間中仍然是仍然

-

編輯:

他確實意味着friend,爲he said(重點煤礦):

最好的例子是內部定義一個朋友功能類型

他的例子進一步說明。可能你需要閱讀「內部定義」,而不是「內部」。 「規定」

這個詞是所有使其中的差別,因爲它看起來像功能的bar引入類的範圍,但實際上,這個名字bar引入封閉命名空間的foo(見§3.3.1/ 3-4和§11.3/ 6)。

這裏是一個更好的例子:

namespace Demo 
{ 
    struct foo 
    { 
     friend void bar(foo* z){} 
    }; 
} 

foo *z; 
bar(z); //foo (type of z) is inside Demo, so is bar 
     //(even though bar is defined inside foo!) 

bar(NULL); //error - NULL doesn't help ADL. 
bar(nullptr); //error - nullptr doesn't help ADL. 

bar(static<foo*>(NULL)); //ok - ADL 

注意名稱bar,即使引入命名空間Demo隱藏,從而不能使用平常的名字 - 外部使用查詢:

using namespace Demo; //brings ALL (visible) names from Demo to current scope 

bar(NULL); //STILL error - means bar is invisible 

或者,

Demo::bar(NULL);  //error - not found 
Demo::foo::bar(NULL); //error - not found 

希望有幫助。

+0

但是,爲什麼ADL不考慮類中的靜態函數,ADL確實考慮了課堂本身的範圍,情況並非如此? – M3taSpl0it

+0

@ M3taSpl0it:否。正如我所說,它仍然在'foo'的封閉名稱空間中。朋友功能似乎在課堂上。名稱實際上在封閉名稱空間範圍內聲明。 – Nawaz

+0

感謝您的確認,我感謝您的回答,您是否可以用C++標準中引用的語句來支持您的聲明,與我的示例相矛盾? 。謝謝 – M3taSpl0it