我有这个功能:
template <typename... Args>
void f(Args... args, int last)
{
}
如果我在没有显式模板参数的情况下调用它,模板推理就会失败:
f(2, 2); // candidate expects 1 argument, 2 provided
但是为参数包提供显式模板参数有效:
f<int>(2, 2); // compiles fine
尽管从逻辑上讲,编译器应该能够推断出参数包除了最后一个参数类型之外的所有参数类型。我该如何解决这个问题?
答案 0 :(得分:1)
来自[temp.deduct.type]:
未推断的背景是:
[...] - 不在 parameter-declaration-list 末尾出现的函数参数包。
您的参数包args
是一个非推断的上下文,因为它不是最后一个参数。非推断的上下文,如名称所示,无法推断 - 这导致模板推导失败。
当您明确提供模板参数(通过f<int>(2, 2)
)时,不必进行推论,因此代码很好,您只需显式调用f<int>(int, int)
。