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
197 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!

sumber:php.cn
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