当函数调用(5.2.2)中的后缀表达式是一个非限定id时,可能会搜索其他在通常的非限定查找(3.4.1)中没有考虑到的名称空间,并且在这些名称空间中,可能会找到其他不可见的名称空间作用域友函数声明(11.3)。对搜索的这些修改取决于参数的类型(对于模板模板参数,则取决于模板的名称空间)
论点)。< / p >
简而言之,尼科莱·乔苏蒂的国家:
如果函数的名称空间中定义了一个或多个参数类型,则不必为函数限定名称空间。
一个简单的代码示例:
namespace MyNamespace
{
class MyClass {};
void doSomething(MyClass) {}
}
MyNamespace::MyClass obj; // global object
int main()
{
doSomething(obj); // Works Fine - MyNamespace::doSomething() is called.
}
namespace N
{
class X {};
void f(X);
X& operator++(X&);
}
int main()
{
// define an object of type X
N::X x;
// apply f to it
N::f(x);
// apply operator++ to it
???
}
当然,你可以写N::operator++(x),但这将破坏操作符重载的全部意义。因此,必须找到一个解决方案,允许编译器找到operator++(X&),尽管它不在作用域内。另一方面,它仍然不应该找到另一个operator++定义在另一个不相关的命名空间,这可能会使调用产生歧义(在这个简单的例子中,你不会得到歧义,但在更复杂的例子中,你可能会)。解决方案是参数依赖查找(ADL),这样称呼是因为查找依赖于参数(更确切地说,依赖于参数的类型)。由于该方案是由Andrew R. Koenig发明的,所以它也经常被称为Koenig查找。