Bahasa C membenarkan inferens parameter templat daripada parameter fungsi, tetapi bukan daripada pembina kelas. Ini boleh menimbulkan persoalan: mengapa tidak membenarkan inferens ini untuk pembina?
Salah satu sebab inferens templat tidak dibenarkan untuk pembina ialah pembina bukan satu-satunya titik masuk untuk kelas. Pembina salin dan pengendali tugasan menyediakan cara tambahan untuk mencipta objek kelas. Membenarkan inferens templat untuk pembina memerlukan pengkompil untuk mempertimbangkan semua titik masuk ini apabila menentukan parameter templat, yang boleh membawa kepada kekaburan sintaksis.
class MyClass { int a; int b; public: MyClass(int a, int b): a(a), b(b) {} };
Dalam contoh ini, jika inferens templat dibenarkan untuk pembina, tidak jelas parameter templat mana yang harus digunakan semasa membuat objek MyClass menggunakan pembina salinan atau tugasan operator.
Satu lagi sebab inferens templat tidak dibenarkan untuk pembina ialah ia boleh membawa kepada tingkah laku yang tidak dijangka. Pertimbangkan kod berikut:
class MyContainer { std::vector<T> vec; }; int main() { MyContainer<int> container; // explicitly specify template parameter MyContainer container2(vec); // infer template parameter from constructor }
Dalam contoh ini, kelas MyContainer boleh dibina sama ada dengan parameter templat yang dinyatakan secara eksplisit atau vektor jenis tertentu. Jika inferens templat dibenarkan untuk pembina, baris kedua kod akan mencipta MyContainer jenis T. Walau bagaimanapun, ini mungkin bukan gelagat yang dimaksudkan, kerana pengguna mungkin ingin mencipta MyContainer jenis int.
Disebabkan kebimbangan ini, inferens templat tidak dibenarkan untuk pembina kelas. Walau bagaimanapun, dalam C 17, pengkhususan templat separa boleh digunakan untuk mencapai kesan yang serupa. Pengkhususan templat separa membolehkan pengguna menentukan parameter templat untuk jenis tertentu, sambil membiarkan parameter templat lain disimpulkan.
template <typename T> class MyContainer { std::vector<T> vec; }; template <> class MyContainer<int> { std::vector<int> vec; }; int main() { MyContainer container; // infer template parameter to 'int' MyContainer<double> container2; // explicitly specify template parameter }
Dalam contoh ini, kelas MyContainer mempunyai pengkhususan templat separa untuk int. Ini bermakna apabila MyContainer dicipta dengan jenis int, parameter templat akan disimpulkan secara automatik sebagai int. Untuk jenis lain, parameter templat mesti dinyatakan secara eksplisit.
Atas ialah kandungan terperinci Mengapa C Tidak Membenarkan Inferens Parameter Templat untuk Pembina?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!