2011-02-04 65 views
3

假設下面的模板定義(代碼是毫無意義的):一個關於Ç問題++模板

template<class X, class Y> 
bool FooBar(const Y& val) { return sizeof(X) + 4; } 

我發現下面的調用代碼是合法的:

float temp = 0.f; 
FooBar<int>(temp); 

正如你所看到的,第二類型參數Y可以省略。編譯器通過查找temp的參數類型來推斷Y的類型。

什麼規則或規範的C + +模板允許這?我很驚訝地看到它。

回答

5

這是模板論證扣除;它與您使用X作爲FooBar的值參數類型並且根本沒有任何模板參數進行調用相同。有一個文件在IBM's compiler site更多的細節。

1

這被稱爲'隱式模板實例化'。見標準,第14.7.1節。我會注意到這是功能模板非常常用的。

+1

實例化是指編譯器生成要運行的函數體的副本,但不是它如何獲取用於調用的模板參數。 – 2011-02-04 05:32:37

3

14.7.1條第2款:

除非將函數模板特殊化已顯式實例化或顯式專業化,當專業化,需要一個函數定義的上下文中引用的函數模板專業化隱式實例存在。

正如耶利米指出,參數推導是你什麼真正問:

14.8.2:

當模板函數的專業化被引用時,所有的模板參數必須有值。這些值可以明確指定,或者在某些情況下從使用中推導出來。 ...

該過程在此處詳細描述。

來源:ISO/IEC 14882:1998(E)

+1

這是模板參數已知的情況。獲取參數是通過模板參數推導完成的。 – 2011-02-04 05:34:06

1

你不一定需要指定每個類型參數。本質上,編譯器根據傳入參數的類型來計算出Y,並且在聲明中指定了X. Java和C++的另一個區別。