首页 > 后端开发 > C++ > 为什么参数相关查找 (ADL) 无法找到具有显式模板参数的函数模板?

为什么参数相关查找 (ADL) 无法找到具有显式模板参数的函数模板?

Susan Sarandon
发布: 2024-12-11 12:42:12
原创
414 人浏览过

Why Does Argument-Dependent Lookup (ADL) Fail to Find Function Templates with Explicit Template Arguments?

ADL 和函数模板

参数相关查找 (ADL) 通过促进函数和对象的自动查找在 C 中发挥着重要作用基于所使用的参数类型的关联命名空间。然而,这种机制在函数模板方面存在局限性。

使用 ADL 查找函数模板的限制

提供的代码片段中的最后一个调用由于无法编译而失败C 规范中的限制。根据 C 标准 03 第 14.8.1.6 节:

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

这意味着 ADL 只能查找在调用范围内可见的函数模板。在给定的示例中,frob<0>是对具有显式模板参数的函数模板的调用。但是,在 main 中调用时没有可见的 frob 模板声明。

与简单函数名称的区别

该限制不适用于简单函数函数名称。对于此类名称,即使该函数在调用范围内不可见,也会使用 ADL。这是因为该调用仍然保持函数调用的语法形式。

示例

以下示例进一步说明了该行为:

namespace A {
  struct B { };
  template<int X> void f(B);
}
namespace C {
  template<class T> void f(T t);
}
void g(A::B b) {
  f<3>(b);    //ill-formed: not a function call
  A::f<3>(b); //well-formed
  C::f<3>(b); //ill-formed; argument dependent lookup
              // applies only to unqualified names
  using C::f;
  f<3>(b);    //well-formed because C::f is visible; then
              // A::f is found by argument dependent lookup
}
登录后复制

在此示例中,对 f 3 (b) 的调用格式错误,因为此时不存在名为 f 的可见函数模板。对 A::f 3 (b) 的调用格式良好,因为 f 模板在 A 命名空间内可见。对 C::f 3 (b) 的调用格式不正确,因为 ADL 仅适用于非限定名称。使用 using 指令来别名 C::f 使得对 f(b) 的调用格式良好,因为 f 名称现在在调用时可见。

以上是为什么参数相关查找 (ADL) 无法找到具有显式模板参数的函数模板?的详细内容。更多信息请关注PHP中文网其他相关文章!

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