为什么在模板参数中不 const A 并绑定到 A()?

Why doesn't const A & bind to A() in template arguments?

本文关键字:绑定 const 参数 为什么      更新时间:2023-10-16

我试图做这个模板实例化,但它不工作。我得到错误:

prog.cpp:7:15: error: template-id 'f<const A&, A()>' for 'void f()' does not match any template declaration

template <class T, T> void f() {}
struct A {};
template void f<const A &, A()>();
int main() {}

这很奇怪,因为当我在main中这样做时,它可以工作:

int main() {
    const A &a = A(); // no error
}

为什么它不能在模板行中工作呢?

非类型模板参数可能重复

这些是模板非类型形参的规则

非类型模板参数必须是以下类型之一(可选的cv限定):

  • 整型或枚举型,
  • 指向对象或指向函数的指针,
  • 左值指向对象或左值指向函数
  • 指针指向成员,
  • std::nullptr_t .

传递的是一个RValue(不能赋值的临时对象等),它不属于上述任何一种可能性。

编辑:

看起来它实际上被解释为函数类型,但是您的模板签名期望类型为A(恰好是const A&)的非类型参数

模板实参不能是临时对象。只有可以合理地比较精确相等的基本类型才能作为模板非类型参数。这包括

  • 整数,
  • 计数器,
  • 指向具有extern链接的对象。

,

  • 不允许使用浮点数,因为它们可能非常接近但不等于
  • static对象可能具有相同的名称,但在不同的文件中有不同的位置,这将使template-id混淆地解析到不同文件中具有相同名称的不同实例化
  • 同样适用于字符串字面值
  • 临时对象没有一致的地址,所以你不能传递指向一个
  • 的指针
  • 传递的临时对象的值,甚至不能测试是否相等,永远不会让语言将一个模板实例与另一个模板实例匹配!

(正如Pubby所指出的,A()实际上被解释为没有参数返回A的函数类型。因此,编译器只是没有找到包含两个类型参数的模板声明。)

相关文章: