簡體   English   中英

關於C ++模板的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM