模板類型推導是C 的一個強大功能,它允許編譯器從傳遞給模板的參數推斷出模板的類型參數。模板。但是,在某些情況下,編譯器無法推導出類型參數,並且必須使用所需的類型參數明確實例化模板。
考慮以下函數:
template<typename T> void printme(T&& t) { for (auto i : t) std::cout << i; }
這個函數需要一個啟用 begin()/end() 類型的參數。問題是,為什麼下面的程式碼是非法的?
printme({'a', 'b', 'c'});
當所有這些都是合法的時:
printme(std::vector<char>({'a', 'b', 'c'})); printme(std::string("abc")); printme(std::array<char, 3> {'a', 'b', 'c'});
我們甚至可以這樣寫:
const auto il = {'a', 'b', 'c'}; printme(il);
或:
printme<std::initializer_list<char>>({'a', 'b', 'c'});或:
printme<std::vector<char>>({'a', 'b', 'c'})
第一行程式碼是非法的,因為無法推斷模板參數T。如果明確指定模板參數,它將起作用,例如:
printme<std::initializer_list<char>>({'a', 'b', 'c'})或:
A function parameter for which the associated argument is an initializer list (8.5.4) but the parameter does not have std::initializer_list or reference to possibly cv-qualified std::initializer_list type.其他程式碼行是合法的,因為參數具有明確定義的類型,因此可以很好地推導模板參數T。 可能令人困惑的部分是 auto 會選擇類型std::initializer_list
if the initializer is a braced-init-list (8.5.4), with std::initializer_list<U>.但是,對於auto,§ 7.1.6.4/6 有明確支持std: :initializer_list:
以上是為什麼 C 中的「initializer_list」範本類型推導失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!