C++中依赖于参数的查询

Fro*_*art 7 c++ argument-dependent-lookup

这是如何运作的?它与ADL有关吗?

#include <iostream>

template <typename T>
struct A
{
    friend void f(T x)
    {
        std::cout << "A\n";
    }
};

int main()
{
    f(new A<void*>());
}
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我为什么我不能使用类似的东西

f(A<int>());
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 13

f(new A<void*>());    
Run Code Online (Sandbox Code Playgroud)

确实有效,因为依赖参数的查找/ Koenig查找(ADL)
Koenig Lookup声明:

如果在函数的命名空间中定义了一个或多个参数类型,则不必为函数限定命名空间(范围).

考虑一个不使用模板的简单示例,它应该可以帮助您更好地理解ADL:

#include <iostream>
struct A
{
    friend void f(A x)
    {
        std::cout << "A\n";
    }
};

int main()
{
    f(A());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

A
Run Code Online (Sandbox Code Playgroud)

当你使用f(A<int>()),但它要求的是f()需要类型的参数int,但你的结构不会提供任何转换Aint,因此错误.

如果您提供适当的转换,那么它也会起作用.像这样的东西:

operator int(){return 1;}
Run Code Online (Sandbox Code Playgroud)