【问题标题】:Doesn't ADL looks up static member functions?ADL 不查找静态成员函数吗?
【发布时间】:2013-01-21 10:09:59
【问题描述】:

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

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

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

它没有编译,产生错误“‘bar’没有在这个范围内声明”。 ADL是否不考虑静态成员函数?我的意思是在示例中关联的类是foo,所以 ADL 不会在类内部查看吗? .谁能在这里简化一下规则?

【问题讨论】:

  • Bump...发布的答案没有解决为什么 ADL 在此代码中找不到 bar 的问题,而是讨论了朋友功能

标签: c++ argument-dependent-lookup


【解决方案1】:

他大概是这个意思:

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

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

但从技术上讲,bar() 不是内部 foo。它仍然foo的封闭命名空间中。

--

编辑:

他确实是指friend,就像he said(强调我的):

最好的例子是 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,即使被引入命名空间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

希望对您有所帮助。

【讨论】:

  • 但是为什么ADL不考虑类内部的静态函数,而ADL确实考虑了类本身的作用域,不是吗?
  • @M3taSpl0it:不。正如我所说,它仍在foo 的封闭命名空间中。一个朋友函数似乎在类中。在封闭的命名空间范围内实际声明的名称。
  • 感谢您的确认,感谢您的回答,您能否在 c++ 标准中引用的与我的示例相矛盾的语句的支持下备份您的语句? .谢谢
  • @M3taSpl0it:请阅读讨论friend 和ADL 的部分(我有点忙,所以不能自己循环)。并在我的答案(我现在添加)中查看下一个示例。
  • @M3taSpl0it: "P.S : 你的 Big(O) 编辑答案效率低下 :P".. 是什么意思?
猜你喜欢
  • 1970-01-01
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多