下面的代碼編譯:這個函數模板調用爲什麼起作用?
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