Rumah > pembangunan bahagian belakang > C++ > Mengapakah Menggunakan `std::enable_if_t` Dengan Nilai Lalai Menghasilkan Ralat Definisi Semula?

Mengapakah Menggunakan `std::enable_if_t` Dengan Nilai Lalai Menghasilkan Ralat Definisi Semula?

DDD
Lepaskan: 2024-11-12 11:24:02
asal
375 orang telah melayarinya

Why Does Using `std::enable_if_t` With Default Values Result in a Redefinition Error?

Isu Takrifan Semula dengan Enable_if_t Templat Argumen

Dalam kod yang disediakan, percubaan untuk menukar kekangan jenis std::enable_if menggunakan sintaks baharu (typename = std::enable_if_t...) menghasilkan ralat definisi semula. Ini kerana kedua-dua fungsi templat:

template<typename T, typename = std::enable_if_t<std::is_same<int, T>::value>>>
void g() { }
Salin selepas log masuk

dan

template<typename T, typename = std::enable_if_t<std::is_same<double, T>::value>>>
void g() { }
Salin selepas log masuk

kedua-duanya daripada jenis templatvoid(). Hakikat bahawa hujah jenis kedua mempunyai nilai lalai yang berbeza adalah tidak relevan, kerana pengkompil menganggap kedua-dua templat adalah sama.

Untuk menangani isu ini, adalah perlu untuk mengalih keluar nilai lalai daripada kekangan enable_if_t. Ini menghasilkan kod berikut:

template<typename T, std::enable_if_t<std::is_same<int, T>::value, int>*>
void g() { }

template<typename T, std::enable_if_t<std::is_same<double, T>::value, int>*>
void g() { }
Salin selepas log masuk

Dalam kes ini, hujah jenis kedua kini ialah penunjuk, yang jenisnya bergantung pada yang pertama. Pengkompil boleh menggantikan dalam jenis T untuk menentukan sama ada terdapat konflik antara kedua-dua templat dan ia akan menyelesaikan bahawa tidak ada.

Atas ialah kandungan terperinci Mengapakah Menggunakan `std::enable_if_t` Dengan Nilai Lalai Menghasilkan Ralat Definisi Semula?. 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