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
Mary-Kate Olsenasal
2024-12-13 07:27:10979semak imbas

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;

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

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

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;

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