ADL不查找静态成员函数吗?

时间:2013-02-06 09:08:12

标签: c++ argument-dependent-lookup

这是来自Does argument dependent lookup only search namespaces or classes too?的后续问题,其中@DavidRodríguez说“ADL会查看该类型的封闭命名空间,并且内部类型本身”。我可能错了他试图说的但我正在尝试这个例子:

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

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

它没有编译,产生错误“'bar'未在此范围内声明”。是不是ADL不考虑静态成员函数?我的意思是在示例中,关联的类是foo所以ADL不会在类中查看? 。任何人都可以在这里简化规则吗?

1 个答案:

答案 0 :(得分:6)

他可能是这个意思:

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

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

但技术上bar() foo内不是。在foo

的封闭命名空间中仍然是

-

编辑:

他的确意味着friendhe 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

希望有所帮助。