使用initializer_list進行模板類型推導
考慮以下函數:
template<typename T> void printme(T&& t) { for (auto i : t) std::cout << i; }
上述函數需要參數具有上述函數() 和end() 成員函數。有多種方法可以使用不同的資料類型來呼叫此函數。例如,我們可以使用 std::vector、std::string、std::array 甚至初始化清單。然而,有一種特殊情況是非法的:
printme({'a', 'b', 'c'});
這行程式碼將導致編譯時錯誤。為什麼會出現這種情況?
模板參數推導失敗
只有函數參數類型與提供的參數類型相符時,模板參數的類型推導才能成功。對於printme 函數:
因此,在初始化清單參數的情況下,編譯器無法推導出模板參數 T。明確指定模板參數將解決該問題(例如 printme
auto 的特殊情況
雖然 printme 函數中的初始化列表參數是非法的,但它是有效的使用 auto 來初始化保存初始化列表的變數。這是因為 auto 會將 il 的型別推導為 std::initializer_list
以上是為什麼本範例中的「initializer_list」範本類型推導失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!