2013-03-03 54 views
0

編譯器如何將值3傳遞給非類型參數x如何將值3傳遞給'x'以實例化模板函數'f'?

#include <iostream> 

template <typename Type, size_t x> 
void f(Type (&a)[x]) 
{ 
    for (int i = 0; i < x; i++) 
    { 
     a[i] = i; 
     std::cout << a[i] << '\n'; 
    } 
} 

int main() 
{ 
    int v[3]; 
    f(v); 
} 
+0

模板類型扣除 – 2013-03-03 00:32:03

+0

x是size_t類型,因此它在編譯時有一個定義的類型 – hmatar 2013-03-03 00:32:13

回答

0

模板允許使用類型名稱和整數類型,如size_t

對於整數類型,模板函數使用值(必須在編譯時已知)初始化,而不是類型。

編譯器知道函數f()預計Type (&a)[x]類型和檢查的說法,如果有的Typex任何組合會爲你傳遞的參數v工作。

這個過程被稱爲模板類型扣除

+0

但調用'f(v)'沒有模板第二個參數。如何從這個電話中扣除'x'? – WaldB 2013-03-03 00:34:52

+0

對'f(v)'的調用不提供* * *模板參數。編譯器通過分析「v」是什麼來推斷('int'和'3')。 – 2013-03-03 00:36:57

+0

你知道這個構造在哪裏嗎int v [3]; int(&t)[3] = v; f(t);'是否支持標準?我正在專門討論表達式'int(&t)[3] = v;'。 – WaldB 2013-03-03 00:56:07

相關問題