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
DDDasal
2024-11-12 11:24:02300semak imbas

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() { }

dan

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

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() { }

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:
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