关于参数依赖查找(ADL)未找到函数f的困惑
参数依赖查找(ADL)未匹配函数的原因解析
问题代码
struct S; namespace A{ void f(S&&) {}; namespace B{ struct S{}; } } int main(void) { f(A::B::S()); }
疑问点
参数依赖查找(又称ADL或Koenig查找)是在函数调用表达式中查找非限定函数名的规则,除常规非限定查找的作用域和命名空间外,还会在参数的命名空间中查找。
我认为常规非限定查找会检查命名空间A,ADL应额外检查A和A::B,但为何ADL未在A中找到f?是否误解了上述规则?
原因解释
核心问题是两个S是完全不同的类型:
- 命名空间A中声明的
void f(S&&),这里的S是全局作用域前向声明的struct S;; - 调用时传入的
A::B::S(),是命名空间A::B内定义的独立struct S。
这两个S只是名字相同,本质是毫无关联的类型,所以A中的f参数类型和实参类型不匹配,ADL即使在A和A::B中查找,也找不到能匹配A::B::S&&的f函数。
另外,常规非限定查找也不会自动搜索命名空间A——常规查找只会从当前作用域(main函数)往上找全局作用域,不会主动进入未被using引入的命名空间,所以也找不到A中的f。
内容的提问来源于stack exchange,提问作者mada
相关产品推荐
相关产品推荐

