我无法理解参数相关(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 规则背后的(可能是血淋淋的,我知道)细节是什么?
我很好地理解了这个概念,但细节是我遇到的麻烦。
搜索哪些范围,何时搜索,何时不搜索?
是否完全有可能判断是否使用了 ADL 而无需在给定的代码行之前查看所有'#include
d 文件?我希望函子和函数在 [not] 屏蔽 ADL 方面表现相同,但显然它们没有。
如果ADL 不是自动完成(例如上面的)并且您不知道类的命名空间(例如在模板中),有什么方法可以强制ADL?