[英]A question regarding C++ template
假設以下模板定義(代碼無意義):
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 ++模板允許這個? 我很驚訝地看到它。
這是模板參數推導; 它就像你使用X
作為FooBar
的值參數的類型一樣,並且在沒有任何模板參數的情況下調用它。 在IBM的編譯器站點上有一個包含更多詳細信息的文檔。
14.7.1第2段:
除非已明確實例化或明確專門化了函數模板特化,否則在需要存在函數定義的上下文中引用特化時,將隱式實例化函數模板特化。
正如耶利米指出的那樣,論證演繹是你真正要問的:
14.8.2:
引用模板函數特化時,所有模板參數都必須具有值。 可以明確指定值,或者在某些情況下,從使用中推斷出值。 ...
在那里詳細描述了該過程。
資料來源:ISO / IEC 14882:1998(E)
這稱為“隱式模板實例化”。 參見標准,第14.7.1節。 我會注意到這通常用於功能模板。
您不一定需要指定每個類型參數。 本質上,編譯器根據傳入的參數類型計算出Y,並在聲明中指定了X. Java和C ++之間的另一個區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.