Potongan Jenis Templat dengan initializer_list
Pertimbangkan fungsi berikut:
template<typename T> void printme(T&& t) { for (auto i : t) std::cout << i; }
Fungsi di atas mengharapkan satu parameter dengan begin() dan end() fungsi ahli. Terdapat beberapa cara untuk memanggil fungsi ini dengan jenis data yang berbeza. Sebagai contoh, kita boleh menggunakan std::vector, std::string, std::array, atau bahkan senarai pemula. Walau bagaimanapun, terdapat satu kes tertentu yang menyalahi undang-undang:
printme({'a', 'b', 'c'});
Barisan kod ini akan mengakibatkan ralat masa kompilasi. Mengapakah ini berlaku?
Kegagalan Potongan Argumen Templat
Penolakan jenis untuk argumen templat hanya boleh berjaya jika jenis parameter fungsi sepadan dengan jenis argumen yang dibekalkan. Dalam kes fungsi printme:
Akibatnya, pengkompil tidak dapat menyimpulkan hujah templat T dalam kes argumen senarai pemula. Menentukan hujah templat secara eksplisit akan menyelesaikan isu (cth., printme
Kes Khas untuk auto
Walaupun argumen senarai pemula adalah menyalahi undang-undang dalam fungsi printme, ia adalah sah untuk menggunakan auto untuk memulakan pembolehubah yang memegang senarai pemula. Ini kerana auto akan menyimpulkan jenis il sebagai std::initializer_list
Atas ialah kandungan terperinci Mengapa Potongan Jenis Templat Gagal dengan `inisializer_list` dalam Contoh Ini?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!