首页 >后端开发 >C++ >为什么在 C 中参数依赖查找无法找到带有显式模板参数的函数模板?

为什么在 C 中参数依赖查找无法找到带有显式模板参数的函数模板?

Patricia Arquette
Patricia Arquette原创
2024-12-09 05:42:10915浏览

Why Does Argument Dependent Lookup Fail to Find Function Templates with Explicit Template Arguments in C  ?

C 中的参数相关查找和函数模板

参数相关查找 (ADL) 是一种语言功能,使编译器能够搜索标识符在与函数调用的参数关联的命名空间内。虽然 ADL 通常会查找函数,但在某些情况下无法找到函数模板。

C 标准解释

C 标准 (2003) 第 14.8.1.6 节指出那:

“但是当使用带有显式模板参数的函数模板时,调用没有正确的语法形式,除非在调用时存在具有该名称可见的函数模板。如果没有可见的此类名称,则该调用在语法上不正确,并且依赖于参数的查找不适用。”

示例

考虑以下示例:

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

int main() {
    ns::foo f;
    non_template(f); // This is fine.
    frob<0>(f); // This is not.
}

main 中的最后一个调用(frob(f);) 无法编译,因为在调用范围内没有名称为 frob 的函数模板可见。 ADL 找不到 frob;因为编译器的语法不认为函数模板是有效的函数调用。

其他注意事项

  • 对于简单的函数名称(没有模板参数),ADL 仍然可以查找函数模板,即使其名称不可见。
  • 但是,如果使用显式模板参数调用函数模板,则函数模板具有该特定名称的函数必须在调用范围内可见,ADL 才能成功。
  • 在某些情况下,使用声明可以使函数模板可见,从而允许 ADL 找到它。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn