考慮以下函數:
template<typename T> void printme(T&& t) { for (auto i : t) std::cout << i; }
此函數採用帶有begin()/end 的單一參數( ) 啟用類型。但是,以下程式碼片段被認為是非法的:
printme({'a', 'b', 'c'});
儘管使用向量、字串、陣列和明確初始化列表的類似程式碼可以正常運作。問題來了,為什麼這個特定的片段是非法的?
理解這個問題的關鍵在於模板參數推導。在這種情況下,無法推導模板參數 T。為了修正這個問題,必須明確指定模板參數,如下所示:
printme<vector<char>>({'a', 'b', 'c'}) printme<initializer_list<char>>({'a', 'b', 'c'})
在上述程式碼合法的片段中,參數擁有明確定義的類型,允許使用模板參數 T可以無縫推斷。使用 auto 還可以使函數正常工作,因為它推斷類型為 std::initializer_list
但是,在比較範本參數推導和 auto 關鍵字時,會出現奇怪的行為。雖然 auto 將型別推斷為 std::initializer_list
儘管如此,auto 關鍵字特別支援 std::initializer_list,允許程式碼運行正確。
以上是為什麼 C 中的初始化列表模板推導失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!