Pertimbangkan fungsi berikut:
template<typename T> void printme(T&& t) { for (auto i : t) std::cout << i; }
Fungsi ini mengambil satu parameter dengan permulaan()/akhir () jenis yang didayakan. Walau bagaimanapun, coretan kod berikut dianggap menyalahi undang-undang:
printme({'a', 'b', 'c'});
Walaupun kod serupa yang menggunakan vektor, rentetan, tatasusunan dan senarai pemula eksplisit berfungsi tanpa masalah. Timbul persoalan, mengapakah coretan khusus ini menyalahi undang-undang?
Kunci untuk memahami isu ini terletak pada potongan hujah templat. Dalam kes ini, hujah templat T tidak boleh disimpulkan. Untuk membetulkan perkara ini, seseorang mesti menyatakan dengan jelas hujah templat, seperti yang dilihat di bawah:
printme<vector<char>>({'a', 'b', 'c'}) printme<initializer_list<char>>({'a', 'b', 'c'})
Dalam coretan yang dinyatakan di atas di mana kod itu sah, hujah itu mempunyai jenis yang jelas, membenarkan hujah templat T untuk disimpulkan dengan lancar. Penggunaan auto juga membolehkan fungsi berfungsi, kerana ia menyimpulkan jenis std::initializer_list
Walau bagaimanapun, tingkah laku pelik timbul apabila membandingkan potongan hujah templat dan kata kunci auto. Walaupun auto membuat kesimpulan jenis std::initializer_list
Walau bagaimanapun, kata kunci auto secara khusus menyokong std::initializer_list<>, membenarkan kod berfungsi dengan betul.
Atas ialah kandungan terperinci Mengapa Potongan Templat Gagal dengan Senarai Pemula dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!