[英]Doesn't ADL looks up static member functions?
这是来自依赖于参数的查询的后续问题, 只搜索名称空间或类吗? ,其中@DavidRodríguez说“ADL将查看该类型的封闭命名空间,以及类型本身内部 ”。 我可能错了他想说的但是我试着这个例子:
struct foo{
static void bar(foo* z){}
};
int main(){
foo* z;
bar(z);
}
它没有编译,产生错误“'bar'未在此范围内声明”。 是不是ADL不考虑静态成员函数? 我的意思是在示例中关联的类是foo
所以不会ADL看到类里面? 。 任何人都可以在这里简化规则吗?
他可能是这个意思:
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
请注意,即使引入名称空间Demo
,名称bar
也是隐藏的 ,因此无法使用通常的名称查找从外部使用:
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
希望有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.