在可变参数函数模板中没有推导出上下文

GSi*_*GSi 5 c++ variadic-templates c++11 template-argument-deduction

如我所知,以下代码应该是"不推断上下文"(或不是?)

template <class... X, class Y>
void f(X... args, Y y)
{

}

int main()
{
    f(12);
    f<int, int, int>(1, 2, 3, 4);
}
Run Code Online (Sandbox Code Playgroud)

但G ++ 4.9编译它的两个实例fmain...谁能解释一下吗?

Soh*_*neh 0

该规则仅适用于类模板,不适用于函数,因为可以为函数推导模板。如果您在类模板上尝试这样做,您将看到错误:

template <class... X, class Y>
class C {  // This won't compile.
};
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf中的第7页:

如果类模板的模板参数是模板参数包,则它必须是最后一个模板参数。注意:这不是要求这些不是函数模板的要求,因为可能会推导模板参数 (14.8.2)