5

我编写了以下代码,模板参数推导失败:

template<int>
struct num {};

template<int m>
void match(num<2*m>) {
}

int main()
{
  match(num<2>());
  return 0;
}

我凭直觉知道编译器无法推断出正确的m,但我想了解它为何失败的理论基础。有人可以解释一下吗?

4

1 回答 1

6

好吧,您基本上是在要求编译器2 * m == 2为您解方程,以便m确定match. 编译器不会在模板参数推导期间求解方程,无论它们多么简单和明确。

14.8.2.4/14 (C++03)、14.8.2.5/16 (C++11) 中的语言规范涵盖了您的情况并有类似的示例

14如果在声明具有非类型模板参数的函数模板 ,在函数参数列表中的表达式中使用 了非类型模板参数,则必须始终显式指定或推导相应的模板参数其他地方,因为对于这样的模板参数,类型推导总是会失败。

template<int i> class A { /* ... */ };
template<short s> void g(A<s+1>);

void k() {
  A<1> a;
  g(a); //error: deduction fails for expression s+1
  g<0>(a); //OK
}

至于为什么这样做……我认为很明显,在一般情况下,求解数学方程的问题太复杂了。它还可能导致模棱两可的解决方案或不属于预期域的解决方案。例如,您希望编译器推断match(num<3>())什么?

于 2012-11-28T02:21:46.937 回答