Potongan Argumen Templat Separa untuk Templat Kelas: Dilawati Semula
Walaupun terdapat usaha yang digariskan dalam P0091 untuk menyatukan gelagat templat fungsi dan kelas, kemungkinan potongan hujah separa dalam templat kelas masih sukar difahami. Perbincangan ini menjelaskan batasan semasa dan meneroka kemungkinan sebab di sebaliknya.
Pertimbangkan ujian templat kelas dan pembantu fungsi pembantunya. Walaupun pembantu membenarkan potongan separa, seperti yang ditunjukkan oleh kod yang disediakan, ujian templat kelas yang sepadan tidak.
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]{}; };
template<std::size_t S, typename T> test<S, T> helper(T(&&input)[S]) { return input; }
Setelah percubaan, menjadi jelas bahawa pemotongan templat kelas hanya berlaku apabila semua hujah secara eksplisit disediakan. Penyimpangan daripada tingkah laku yang dijangkakan ini menimbulkan persoalan sama ada terdapat salah faham dalam tafsiran P0091.
Seperti yang dicadangkan oleh laporan perjalanan Botond Ballo, potongan separa untuk templat kelas telah dicadangkan dan kemudiannya ditarik balik kerana kebimbangan mengenai kekeliruan. . Sebagai contoh, kod berikut akan menyebabkan potongan kepada tuple
tuple<int> t(42, "waldo", 2.0f);
Untuk mengelakkan kekaburan tersebut, set lengkap hujah templat mesti disediakan untuk templat kelas, manakala potongan separa kekal sebagai pilihan untuk templat fungsi.
Atas ialah kandungan terperinci Mengapa Kami Tidak Dapat Menyimpulkan Sebahagian Argumen Templat untuk Templat Kelas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!