模板推导失败,参数包后有参数

Template deduction fails with argument after parameter pack

我有这个功能:

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

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

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

但是为参数包提供显式模板参数是可行的:

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

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

[temp.deduct.type]/p5:

The non-deduced contexts are:

  • [...]
  • A function parameter pack that does not occur at the end of the parameter-declaration-list.

要获得扣除,您必须做

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

并切掉正文中的最后一个参数,或者改为 last first

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

很难给出更具体的建议,因为我们不知道这个函数模板应该做什么。

来自[temp.deduct.type]:

The non-deduced contexts are:
[...] — A function parameter pack that does not occur at the end of the parameter-declaration-list.

您的参数包 args 是非推导上下文,因为它不是最后一个参数。非推导上下文,顾名思义,无法推导 - 这会导致模板推导失败。

当您显式提供模板参数(通过 f<int>(2, 2))时,无需进行推导,因此代码没有问题,您只是显式调用 f<int>(int, int)