2013-02-06 63 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