You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于参数依赖查找(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 19:48:15