Rumah > pembangunan bahagian belakang > C++ > Mengapa SFINAE Gagal dalam Jenis Pulangan tetapi Berjaya dengan Parameter Templat?

Mengapa SFINAE Gagal dalam Jenis Pulangan tetapi Berjaya dengan Parameter Templat?

Mary-Kate Olsen
Lepaskan: 2024-12-13 07:27:10
asal
1044 orang telah melayarinya

Why Does SFINAE Fail in Return Types but Succeed with Template Parameters?

SFINAE dalam Jenis Pulangan lwn. Parameter Templat

Andaikan kita mempunyai templat fungsi foo yang membezakan antara nombor integral dan titik terapung:

template<typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T) -> void;

template<typename T, typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T) -> void;
Salin selepas log masuk

Walau bagaimanapun, kod ini gagal dengan ralat apabila dipanggil dengan double nilai:

foo(3.4);
// Error: no matching function for call to 'foo(double)'
Salin selepas log masuk

Mengapa pendekatan ini gagal?

Dalam kes ini, SFINAE digunakan untuk mentakrifkan jenis pemulangan foo secara bersyarat. Walau bagaimanapun, ini melanggar peraturan lebihan templat fungsi, yang tidak menganggap hujah templat lalai. Akibatnya, pengkompil menganggap kedua-dua templat foo sebagai fungsi yang sama dengan tandatangan yang sama.

Pendekatan Alternatif menggunakan Parameter Templat Rujuk Ungkapan

Untuk menyelesaikan isu ini, kami boleh sebaliknya gunakan parameter templat merujuk ungkapan dalam jenis pulangan:

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_integral<T>::value>::type;

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_floating_point<T>::value>::type;
Salin selepas log masuk

Dengan pengubahsuaian ini, ungkapan std::enable_if menjadi sebahagian daripada tandatangan fungsi, membenarkan SFINAE membezakan antara dua templat foo.

Oleh itu, versi kedua foo berfungsi dengan betul, manakala versi pertama mencetuskan ralat.

Atas ialah kandungan terperinci Mengapa SFINAE Gagal dalam Jenis Pulangan tetapi Berjaya dengan Parameter Templat?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan