这是来自
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看到类里面? .任何人都可以在这里简化规则吗?
解决方法
他可能是这个意思:
struct foo{ friend void bar(foo* z){} //not static,its friend now }; foo* z; bar(z); //fine now
但是技术上bar()不在foo里面.它仍然在foo的封闭命名空间中.
–
编辑:
他的确意味着朋友,如he said(强调我的):
The best example is a friend function that is defined inside the type
他的例子进一步说明了.可能你需要阅读“内部定义”,而不仅仅是“内部”.
“定义”这个词就是有所不同的,因为看起来函数的名称栏被引入到类的范围内,但实际上,名称栏被引入到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,名称栏也是隐藏的,因此无法使用通常的名称查找从外部使用:
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
希望有所帮助.