参数依赖查找的混乱?

时间:2014-05-31 06:22:08

标签: c# c++ extension-methods argument-dependent-lookup

我从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有任何关系吗?

1 个答案:

答案 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.
}