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中文网其他相关文章!