Rumah > pembangunan bahagian belakang > C++ > Mengapa Parameter Templat C Tidak Boleh Disimpulkan untuk Pembina Kelas Seperti Templat Fungsi?

Mengapa Parameter Templat C Tidak Boleh Disimpulkan untuk Pembina Kelas Seperti Templat Fungsi?

DDD
Lepaskan: 2024-12-08 17:44:12
asal
254 orang telah melayarinya

Why Can't C   Template Parameters Be Inferred for Class Constructors Like Function Templates?

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;
}
Salin selepas log masuk

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; }
};
Salin selepas log masuk

Jika inferens templat dibenarkan, kod berikut akan sah:

Variable var(2); // Equivalent to Variable<int> var(2);
Salin selepas log masuk

Tetapi bagaimana jika kami menggunakan pembinaan salinan atau tugasan operator?

MyClass m(string s);
MyClass *pm;
*pm = m;
Salin selepas log masuk

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);
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan