Perbezaan Tingkah Laku SFINAE dalam Jenis Pulangan lwn Parameter Templat
Dalam C , simpulan bahasa Gantian Bukan Ralat (SFINAE) membenarkan bersyarat lebihan fungsi berdasarkan metaprogramming templat dan ciri jenis. Walau bagaimanapun, terdapat keadaan di mana SFINAE berkelakuan berbeza bergantung pada peletakannya dalam perisytiharan templat fungsi.
Pertimbangkan kod berikut:
template<typename T, typename = typename std::enable_if< std::is_integral<T>::value>::type> void foo(T); // Incorrect placement, triggers error template<typename T, typename = typename std::enable_if< std::is_floating_point<T>::value>::type> void foo(T); // Incorrect placement, triggers error template<typename T> void foo(T) // Correct placement -> typename std::enable_if< std::is_integral<T>::value>::type; template<typename T> void foo(T) // Correct placement -> typename std::enable_if< std::is_floating_point<T>::value>::type;
Dalam set pertama lebihan (peletakan yang salah), meletakkan SFINAE dalam parameter templat dan bukannya jenis pulangan mengakibatkan ralat penyusunan. Ini kerana argumen templat lalai (dalam kes ini, akhiran ::type) tidak dipertimbangkan dalam menentukan kesetaraan beban lampau. Akibatnya, pengkompil menganggap fungsi sebagai pengisytiharan pendua dengan tandatangan yang sama.
Walau bagaimanapun, dalam set kedua lebihan (peletakan yang betul), SFINAE digunakan pada jenis pemulangan, yang melibatkan pengaturcaraan meta templat. Peletakan ini memastikan bahawa ungkapan yang merujuk kepada parameter templat adalah sebahagian daripada tandatangan fungsi. Akibatnya, pengkompil mengiktiraf beban berlebihan sebagai entiti yang berbeza, membolehkan SFINAE berfungsi dengan baik.
Atas ialah kandungan terperinci Bagaimanakah Gelagat SFINAE Berbeza Antara Jenis Pemulangan dan Parameter Templat dalam Lebihan Fungsi C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!