为什么Koening查找不能在这里工作?

mad*_*adu 3 c++ argument-dependent-lookup

依赖于参数的查找说:

对于类类型的参数(包括union),该集合包含... a)类本身b)...

那为什么printX找不到X?

 #include<iostream>
using namespace std;

class A {
public:
    static const int X = 1;
};

class B {
public:
    static void printX(A a)
    {
        cout << "X is " << X << endl;
    }
};

int main(int argc, char** argv)
{
    A a;
    B::printX(a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 5

这不是ADL应该做的事情.ADL适用于非限定函数调用,并且首先在定义了参数类型的名称空间中搜索该函数.

例,

namespace N
{
      struct A {};

      void f(A const &) {}
}

N::A a;

N::f(a); //qualified function call. ADL is not needed.
f(a);    //unqualified function call. ADL works here
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,来自命名空间的f(a)调用.由于是非限定函数调用,ADL使编译器能够首先在命名空间中搜索函数,因为参数的类型定义在.f()Nf(a)fNaN

希望有所帮助.