模板參數推導和非推導上下文
在C 中,模板參數推導允許編譯器根據類型決定模板參數的類型傳遞給模板函數或類別的參數。但是,在涉及非推導上下文的某些場景中,此機制可能會失敗。
考慮以下程式碼片段:
template <class T> struct S { typedef T& type; }; template <class A> A temp(S<A>::type a1) { return a1; } template <class A, class B> B temp2(S<A>::type a1, B a2) { return a1 + a2; }
這裡,S 結構體用作獲取對該類型的引用的一種方式由模板參數 A 保存。但是,當嘗試使用整數值呼叫這些函數時,如下所示,編譯器會報告錯誤:
int main() { char c = 6; int d = 7; int res = temp(c); int res2 = temp2(d, 7); }
錯誤訊息:
錯誤訊息:
錯誤訊息:
錯誤訊息1 :temp(S::type):無法推導出A
的模板參數temp<char>(c);錯誤2:temp2(S::type,B):無法推斷模板參數A解釋:出現此問題是因為A 的型別僅在非推導上下文中使用,這意味著編譯器無法從參數推斷它傳遞給函數。特別是,S::type 被認為是非推導的,因為它出現在嵌套模板類型中,並且與 temp 或 temp2 的參數沒有直接關係。 解決方案:要解決此問題並啟用模板參數推導,在呼叫函數時必須明確指定A 的類型,如下所示:這個明確規格允許編譯器確定A 的類型並成功實例化模板函數。
以上是為什麼模板參數推導在非推導上下文中失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!