模板推导因参数包后的参数而失败

时间:2015-09-18 21:10:30

标签: c++ templates c++11 template-deduction

我有这个功能:

template <typename... Args>
void f(Args... args, int last)
{
}

如果我在没有显式模板参数的情况下调用它,模板推理就会失败:

f(2, 2); // candidate expects 1 argument, 2 provided

但是为参数包提供显式模板参数有效:

f<int>(2, 2); // compiles fine

尽管从逻辑上讲,编译器应该能够推断出参数包除了最后一个参数类型之外的所有参数类型。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

来自[temp.deduct.type]:

  

未推断的背景是:
  [...] - 不在 parameter-declaration-list 末尾出现的函数参数包。

您的参数包args是一个非推断的上下文,因为它不是最后一个参数。非推断的上下文,如名称所示,无法推断 - 这导致模板推导失败。

当您明确提供模板参数(通过f<int>(2, 2))时,不必进行推论,因此代码很好,您只需显式调用f<int>(int, int)