0

我从这里举了下面的例子。

namespace NS 
{
   class A {};
   void f( A *&, int ) {}
}
int main() 
{
   NS::A *a;
   f( a, 0 );    //calls NS::f
}

当我试图在 C++ 中找到扩展函数时,我遇到了这种情况。

上面的示例是否只是意味着,如果我调用具有第一个参数的任何函数作为任何类的对象,并且如果在当前命名空间中找不到该函数,那么编译器会在第一个对象的命名空间中找到所需的函数?

如果我错了,这个问题似乎无关紧要,但是C#中的扩展方法与ADL有关系吗?

4

1 回答 1

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.
}
于 2014-05-31T07:15:00.263 回答