下面的代码编译:这个函数模板调用为什么起作用?
template<int...>
struct Indices {};
template<int J, int ...I>
void foo(Indices<I...>) {}
int main(int argc, char **argv)
{
foo<2>(Indices<3,4,5>()); //why does this work?
return 0;
}
在函数调用,在我看来,该J
参数成为2
和...I
参数变为3,4,5
?
但是,它为什么这样工作?我只指定2
在foo<2>
这意味着我指定J
为2
和...I
为无。为什么我仍然可以通过Indices
参数指定...I
?这里使用了什么模板机制?
更新:目前的答案并不能解释为什么我可以有一个参数没有推导(明确指定),但推导出其他参数。这个工作到底是什么时候?我希望我不依赖于未定义的行为。标准允许我在上面做什么?
当你说'富<2>(指数<3,4,5>)',你输入一个类型'指数<3,4,5>'入模板函数。由于输入类型在编译时已知,并且该类型对应于第二个模板参数,因此编译器可以匹配'<3,4,5>'和''并生成正确的函数。 –
Suedocode