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

时间:2012-09-05 04:26:27

标签: 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*>());
}

有人可以告诉我为什么我不能使用像

这样的东西
f(A<int>());

1 个答案:

答案 0 :(得分:13)

f(new A<void*>());    

确实有效,因为 Argument dependent lookup/Koenig lookup ADL ) Koenig Lookup说:

  

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

考虑simplistic example不使用模板,它可以帮助您更好地理解ADL:

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

int main()
{
    f(A());
    return 0;
}

输出

A

当您使用f(A<int>())时,它要求f()需要int类型的参数,但您的结构不提供从A到{{1}的任何转换因而错误。

If you provide the appropriate conversion then it will work as well. Something like

int