我无法理解依赖于参数(Koenig)查找的规则。
请考虑以下代码:
#include <iostream>
using namespace std;
namespace adl
{
struct Test { };
void foo1(Test const &) { cout << "ADL used (foo1)" << endl; }
void foo2(Test const &) { cout << "ADL used (foo2)" << endl; }
void foo3(Test const &) { cout << "ADL used (foo3)" << endl; }
}
struct foo1
{
foo1() { }
template<class T>
foo1(T const &) { cout << "ADL not used (foo1)" << endl; }
template<class T>
void operator()(T const &) const { cout << "ADL not used (foo3)" << endl; }
};
template<class T> void foo2(T const &)
{ cout << "ADL not used (foo2)" << endl; }
int main()
{
adl::Test t;
foo1 foo3;
(foo1(t));
(foo2(t));
(foo3(t));
}
它的输出是:
未使用ADL(
foo1
)
使用ADL(foo2
)
未使用ADL(foo3
)
我希望他们所有人都使用ADL,但我很惊讶他们中只有一些人这样做了。
ADL规则背后的(可能是血腥的,我知道的)细节是什么?
我很清楚这个概念,但细节是我遇到的麻烦。
搜索哪些范围,何时搜索,以及何时未搜索?
是否可以判断是否使用ADL而无需在给定的代码行之前查看 所有 #include
'd文件?我希望仿函数和函数在[不]屏蔽ADL方面的行为方式相同,但显然它们没有。
有没有办法强制 ADL在没有自动完成的情况下(例如上面的)并且你不知道类的命名空间(例如在模板中)?
答案 0 :(得分:5)
你的问题不是真的与参数相关的查找。首先,参数依赖查找只有在进行不合格的函数查找时才可能进入图像。调用foo1(t)
foo1
时是一种类型,并调用其模板化构造函数。类似地,foo3(t)
是一个限定查找,因为foo3
是一个对象,并且在对象的类foo1
中查找函数调用操作符。参数查找进入图片的唯一地方是调用foo2(t)
查找候选者的地方:
::foo2<adl::Test>(adl::Test const&)
::adl::foo2(adl::Test const&)
这两个函数被移交给重载解析,因为两个函数同样匹配非模板函数获胜。
你的问题实际上是三个问题: