您问:
上面的示例是否只是意味着,如果我调用具有第一个参数的任何函数作为任何类的对象,并且如果在当前命名空间中找不到该函数,那么编译器会在第一个对象的命名空间中找到所需的函数?
回答:
通过使用 ADL,编译器将找到所有可能的候选函数。它恰好找到一个,它将使用它。如果它找到多个,它将出错。只有在当前命名空间中找不到函数时才使用 ADL。
示例 1:
#include <iostream>
using namespace std;
namespace NS1
{
struct A {};
int foo(A a) { return 10; }
}
namespace NS2
{
struct A {};
int foo(A a) { return 20; }
}
int main()
{
cout << foo(NS1::A()) << endl; // Resolves to NS1::foo by using ADL
cout << foo(NS2::A()) << endl; // Resolves to NS2::foo by using ADL
}
示例 2:
#include <iostream>
using namespace std;
namespace NS1
{
struct A {};
}
int foo(NS1::A a) { return 10; }
namespace NS2
{
struct A {};
int foo(A a) { return 20; }
}
int foo(NS2::A a) { return 30; }
int main()
{
cout << foo(NS1::A()) << endl; // Resolves to ::foo(NS1::A)
cout << foo(NS2::A()) << endl; // Unable to resolve.
// ::foo(NS2::A) and NS2::foo(NS2::A) are
// equally valid candidates.
}