在Wikipedia 文章中提到了以下引用:
只有在正常查找非限定名称时找不到匹配的类成员函数时,才会发生 ADL 。在这种情况下, 可以搜索在正常查找期间未考虑的其他名称空间,其中要搜索的名称空间集合取决于函数参数的类型。
所以,我期待下面的程序编译得很好,但它没有:
namespace N1 {
class A {};
void foo (A *p) {}
}
namespace N2 {
void foo (N1::A &p) {}
}
int main () {
N1::A xa;
foo(&xa); // ok
foo(xa); // error: cannot convert ‘N1::A’ to ‘N1::A*’ for argument ‘1’ to ‘void N1::foo(N1::A*)’
}
我在 SO 中搜索了几个问题,但找不到哪个以简单的单词列出了要求或情况,这表明:ADL 何时开始?
更详细的答案对我和未来的访客真的很有帮助。