Rumah >pembangunan bahagian belakang >C++ >Mengapakah Potongan Hujah Templat Kelas Separa Tidak Mungkin?
Potongan Argumen Templat untuk Templat Kelas: Had dan Implikasi
Berikutan cadangan P0091 untuk menyatukan gelagat potongan hujah templat untuk fungsi dan templat kelas, timbul persoalan: mengapa potongan hujah templat kelas separa tidak mungkin?
Cadangan awal bertujuan untuk menyelaraskan mekanisme potongan, membenarkan potongan separa dalam kedua-dua konteks. Walau bagaimanapun, kebimbangan timbul mengenai kemungkinan kekeliruan apabila nilai yang disimpulkan menghasilkan berbilang pengkhususan templat yang sah. Contoh klasik ialah potongan jenis tupel: dengan menyatakan hanya satu argumen, pengkompil boleh membuat kesimpulan tuple dengan satu elemen, walaupun definisi tupel asal termasuk berbilang elemen.
Untuk mengelakkan kekaburan sedemikian, separa potongan hujah templat kelas telah dialih keluar daripada cadangan. Pengehadan ini mempengaruhi senario di mana pembangun mungkin ingin menyatakan secara eksplisit parameter templat tertentu sambil membiarkan yang lain disimpulkan.
Sebagai contoh, pertimbangkan templat kelas berikut:
template <std::size_t S, typename T> struct test { static constexpr auto size = S; using type_t = T; test(type_t (&input)[size]) : data(input) {} type_t (&data)[size]{}; };
Fungsi pembantu berfungsi sebagai gula sintaksis untuk membuat seketika objek ujian:
template <std::size_t S, typename T> test<S, T> helper(T (&input)[S]) { return input; }
Apabila menggunakan pembantu dengan tatasusunan pra-diisytiharkan:
int buffer[5]; auto a = helper<5, int>(buffer); // No deduction auto b = helper<5>(buffer); // Type deduced auto c = helper(buffer); // Type and size deduced
Potongan separa tidak disokong dalam kes templat kelas, seperti yang dibuktikan oleh kegagalan auto b = helper<5>(buffer);. Pengkompil tidak boleh membuat kesimpulan parameter T daripada hujah, yang membawa kepada ralat penyusunan. Sebaliknya, auto c = helper(buffer); berjaya menyimpulkan kedua-dua S dan T, menunjukkan keperluan untuk menentukan semua parameter templat secara eksplisit.
Atas ialah kandungan terperinci Mengapakah Potongan Hujah Templat Kelas Separa Tidak Mungkin?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!