考虑一个简单的非限定函数调用:
foo(x);
ADL 意味着foo
不仅在封闭范围和调用所在的命名空间中查找,而且还在x
. 例如 if x
is a std::vector<int>
then 名称空间std
也会被搜索。因此:
int main() {
std::vector<int> x,y;
swap(x,y);
}
没问题,会打电话std::swap()
。
查找还取决于任何模板参数的命名空间,因此 if x
is std::vector<mynamespace::myclass>
thenmynamespace
也包含在查找中。因此
namespace mynamespace {
struct myclass {};
void foo(std::vector<mynamespace::myclass> const&){}
}
int main() {
std::vector<mynamespace::myclass> x;
foo(x);
}
会打电话mynamespace::foo()
。
最后,查找还扩展到用作模板模板参数的任何模板的名称空间。例如
namespace mynamespace {
template<typename T>
struct mytemplate
{};
template<typename T>
void bar(T const&) {}
}
template<template<typename> class T>
struct wrapper {};
int main() {
wrapper<mynamespace::mytemplate> x;
bar(x);
}
即使wrapper
is 在全局命名空间中,mynamespace::bar
也会被找到,因为用于的模板模板参数x
是mynamespace::mytemplate
.