为什么函数模板会抵制 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&) {} void non_template(foo const&) {} }
虽然直接调用 non_template 是允许的,但尝试调用 frob<0> foo 对象无法编译。
为什么?
因为在没有命名空间限定的情况下,调用 frob(f) 在语法上无效。如果没有显式命名空间,编译器无法知道在 ADL 期间要查找哪个 frob 模板。
要纠正此问题,必须显式限定对 frob 的调用或使用 using 将命名空间纳入范围。通过这样做,编译器就可以使用 ADL 来定位正确的模板定义。
以上是为什么参数相关查找 (ADL) 无法在没有显式命名空间限定的情况下找到函数模板?的详细内容。更多信息请关注PHP中文网其他相关文章!