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

Thy*_*dos 3 c++ templates c++11 template-argument-deduction

我有这个功能:

template <typename... Args>
void f(Args... args, int last)
{
}
Run Code Online (Sandbox Code Playgroud)

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

f(2, 2); // candidate expects 1 argument, 2 provided
Run Code Online (Sandbox Code Playgroud)

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

f<int>(2, 2); // compiles fine
Run Code Online (Sandbox Code Playgroud)

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

T.C*_*.C. 5

[temp.deduct.type]/P5:

未推断的上下文是:

  • [...]
  • 函数参数包,不会出现在参数声明列表的末尾.

要获得演绎,你必须这样做

template <typename... Args>
void f(Args... args)
{
}
Run Code Online (Sandbox Code Playgroud)

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

template <typename... Args>
void f(int first, Args... args)
{
}
Run Code Online (Sandbox Code Playgroud)

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