首页 > 后端开发 > C++ > 为什么参数相关查找 (ADL) 无法在没有显式命名空间限定的情况下找到函数模板?

为什么参数相关查找 (ADL) 无法在没有显式命名空间限定的情况下找到函数模板?

Mary-Kate Olsen
发布: 2024-12-10 08:28:13
原创
839 人浏览过

Why Doesn't Argument-Dependent Lookup (ADL) Find Function Templates Without Explicit Namespace Qualification?

为什么函数模板会抵制 ADL 发现

在 C 中,参数相关查找 (ADL) 使编译器能够在没有显式命名空间限定的情况下定位函数。然而,当涉及到函数模板时,ADL 面临着一个限制。

C 标准 03 的 14.8.1.6 中捕获了这个问题的症结:

“但是当函数模板具有显式模板参数时使用时,调用不具有正确的语法形式,除非有一个具有该名称的函数模板在调用点可见

让我们用一个例子来分解它:

在下面的代码片段中,我们在命名空间 ns 中有一个函数模板 frob 和一个非模板函数 non_template:

namespace ns {
    struct foo {};
    template<int i> void frob(foo const&amp;) {}
    void non_template(foo const&amp;) {}
}
登录后复制

虽然直接调用 non_template 是允许的,但尝试调用 frob<0> foo 对象无法编译。

为什么?

因为在没有命名空间限定的情况下,调用 frob(f) 在语法上无效。如果没有显式命名空间,编译器无法知道在 ADL 期间要查找哪个 frob 模板。

要纠正此问题,必须显式限定对 frob 的调用或使用 using 将命名空间纳入范围。通过这样做,编译器就可以使用 ADL 来定位正确的模板定义。

以上是为什么参数相关查找 (ADL) 无法在没有显式命名空间限定的情况下找到函数模板?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板