Mengapakah `enable_if_t` Gagal dalam Definisi Fungsi?

DDD
Lepaskan: 2024-11-18 03:21:02
asal
263 orang telah melayarinya

Why Does `enable_if_t` Fail in Function Definitions?

Pertembungan Argumen Templat: Mengapa enable_if_t Gagal dalam Takrifan

Dalam pengaturcaraan templat, bukan sesuatu yang luar biasa untuk menghadapi situasi di mana kita perlu mendayakan secara bersyarat atau lumpuhkan fungsi templat berdasarkan keadaan tertentu. Dalam kes sedemikian, templat std::enable_if sering digunakan untuk mencapai ini. Walau bagaimanapun, percubaan baru-baru ini untuk menggunakan sintaks std::enable_if_t yang lebih baharu telah membawa kepada ralat yang tidak dijangka.

Dalam coretan kod di bawah, kami mentakrifkan dua fungsi templat f() menggunakan std::enable_if:

template<typename T,
         typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr>
void f() { }

template<typename T,
         typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr>
void f() { }
Salin selepas log masuk

Apabila mengalihkan kod ini untuk menggunakan std::enable_if_t baharu sintaks, kami menghadapi isu:

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

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

GCC mengadu dengan ralat berikut:

error: redefinition of 'template<class T, class> void g()'
       void g() { }
Salin selepas log masuk

Untuk memahami sebab ralat ini berlaku, kita perlu meneliti sintaks hujah templat. Mengalih keluar kod yang tidak diperlukan, kami mempunyai perwakilan ringkas berikut bagi fungsi kami:

template<
  class T,
  class U/* = std::enable_if_t<std::is_same<int, T>::value>*/
>
void g() { }

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

Menjadi jelas bahawa kedua-dua templat adalah daripada jenis templatvoid(), tanpa mengira nilai lalainya yang berbeza untuk hujah jenis kedua. Ini bercanggah dengan keperluan C bahawa dua fungsi templat jenis templat yang sama perlu mempunyai tandatangan yang berbeza.

Untuk menyelesaikan isu ini, kita boleh menukar hujah kedua kepada jenis penunjuk dengan jenis bergantung:

template<
  class T,
  std::enable_if_t<std::is_same<int, T>::value, int>* = nullptr
>
void f() { }

template<
  class T,
  std::enable_if_t<std::is_same<double, T>::value, int>* = nullptr
>
void f() { }
Salin selepas log masuk

Dalam kod yang diubah suai ini, tandatangan fungsi templat kini unik, menghapuskan konflik dan membenarkan pemadanan templat yang betul.

Atas ialah kandungan terperinci Mengapakah `enable_if_t` Gagal dalam Definisi 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