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,但你的结构不会提供任何转换A到int,因此错误.
operator int(){return 1;}
Run Code Online (Sandbox Code Playgroud)