7

这是来自参数依赖查找是否也只搜索名称空间或类的后续问题, 其中@David Rodríguez 说“ADL 将查看类型的封闭命名空间,以及类型本身”。我可能听错了他试图说的话,但我正在尝试这个例子:

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

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

它不编译,产生错误 " 'bar' is not declared in this scope " 。ADL是否不考虑静态成员函数?我的意思是在示例关联类中foo,ADL 不会查看类内部吗?. 任何人都可以在这里简化规则吗?

4

1 回答 1

6

他大概是这个意思:

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

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

但从技术上讲bar()是不在里面 foo。它仍然foo.

--

编辑:

friend正如他所说(强调我的) ,他确实是指:

最好的例子是在类型内部定义的元函数

他的例子进一步说明了这一点。可能您需要阅读“内部定义”,而不仅仅是“内部”。

“定义”这个词是唯一的区别,因为看起来函数的名称 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,即使将 name 引入了 namespace Demo它也是 hidden,因此不能使用通常的 name-lookup 从外部使用:

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

希望有帮助。

于 2013-02-06T09:12:03.577 回答