我从here获取了以下示例。
namespace NS
{
class A {};
void f( A *&, int ) {}
}
int main()
{
NS::A *a;
f( a, 0 ); //calls NS::f
}
当我试图在C ++中找到扩展函数时,我遇到了这个问题。
上面的例子只是意味着,如果我调用任何带有第一个参数的函数作为任何类的对象,并且如果在当前命名空间中找不到该函数,那么编译器会在第一个对象`命名空间中查找所需的函数?
如果我错了,这个问题似乎无关,但 extension method in C# 与ADL有任何关系吗?
答案 0 :(得分:2)
你问:
上面的例子只是意味着,如果我调用任何带有第一个参数的函数作为任何类的对象,并且如果在当前命名空间中找不到该函数,那么编译器会在第一个对象`命名空间中查找所需的函数?
答案:
通过使用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.
}