Kontroversi Inferens Templat Pembina Kelas
Parameter templat boleh disimpulkan dengan mudah daripada argumen fungsi, seperti dalam kod berikut:
template <typename T> void swap(T& a, T& b) { T temp = a; a = b; b = temp; }
Walau bagaimanapun, pendekatan serupa tidak dibenarkan untuk pembina kelas, yang telah menimbulkan persoalan di kalangan C pengaturcara. Mengapa tidak?
Punca di sebalik ketidakkonsistenan ini terletak pada kerumitan pembinaan objek. Pembina bukan satu-satunya titik masuk untuk kelas. Pembina salin dan pengendali tugasan juga memainkan peranan penting, dan membuat kesimpulan parameter templat daripada hanya pembina boleh membawa kepada kekaburan.
Pertimbangkan contoh berikut:
template <typename T> class Variable { T data; public: Variable(T d) { data = d; } };
Jika inferens templat dibenarkan, kod berikut akan sah:
Variable var(2); // Equivalent to Variable<int> var(2);
Tetapi bagaimana jika kami menggunakan pembinaan salinan atau tugasan operator?
MyClass m(string s); MyClass *pm; *pm = m;
Dalam kes ini, pengkompil akan mencabar untuk menentukan jenis templat MyClass pm.
Untuk mengurangkan isu ini, C 17 memperkenalkan potongan jenis daripada hujah pembina . Ini membolehkan parameter templat disimpulkan daripada parameter pembina, menghapuskan keperluan untuk hujah jenis eksplisit dalam situasi tertentu. Contohnya:
std::pair p(2, 4.5); // Inferred as std::pair<int, double> p(2, 4.5); std::tuple t(4, 3, 2.5); // Inferred as std::tuple<int, int, double> t(4, 3, 2.5);
Adalah penting untuk ambil perhatian bahawa ciri inferens ini masih dalam pembangunan dan mungkin tertakluk kepada pengubahsuaian dalam piawaian C masa hadapan. Namun begitu, ia menandakan satu langkah penting ke arah memudahkan kod dan meningkatkan keselamatan jenis.
Atas ialah kandungan terperinci Mengapa Parameter Templat C Tidak Boleh Disimpulkan untuk Pembina Kelas Seperti Templat Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!