Rumah >pembangunan bahagian belakang >C++ >Mengapa SFINAE Gagal dalam Jenis Pulangan tetapi Berjaya dengan Parameter Templat?
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!