Rumah >pembangunan bahagian belakang >C++ >Mengapakah Saya Tidak Boleh Menggunakan `if constexpr` dalam Fungsi Bukan Templat dalam C 17?
C 17 "if constexpr" Terhad kepada Fungsi Templat
Dalam C 17, pengenalan "if constexpr" telah mencetuskan minat terhadapnya keupayaan untuk melaksanakan kod secara bersyarat berdasarkan pemalar masa kompilasi. Walau bagaimanapun, isu timbul apabila cuba menggunakannya dalam fungsi bukan templat.
Pertimbangkan kod berikut:
<code class="cpp">#include <iostream> #include <type_traits> void print(auto value) { // Compile-time check if value is a pointer if constexpr (std::is_pointer_v<decltype(value)>) std::cout << "Ptr to " << *value << std::endl; else std::cout << "Ref to " << value << std::endl; } int main() { // Error when printing a non-pointer print(100); }</code>
Semasa kod ini menyusun tanpa ralat dalam fungsi templat, ia gagal dengan ralat penyusunan apabila diletakkan dalam fungsi bukan templat seperti cetakan. Sebabnya terletak pada kelakuan "if constexpr."
"if constexpr" direka bentuk untuk membenarkan kompilasi bersyarat bagi kod templat. Dalam fungsi templat, pengkompil menyimpulkan jenis parameter pada masa penyusunan, membolehkan pemilihan laluan kod yang sesuai berdasarkan jenis. Dalam kes ini, apabila fungsi cetakan templat, ia boleh mengenal pasti sama ada nilai ialah penunjuk pada masa penyusunan dan melaksanakan cawangan kod yang sepadan.
Walau bagaimanapun, dalam fungsi bukan templat, jenis nilai diketahui hanya pada masa larian, menjadikan "if constexpr" tidak berkesan. Pengkompil menganggap kedua-dua cawangan bersyarat sebagai kod boleh laku, yang membawa kepada ralat kompilasi apabila cuba menyahrujuk nilai dalam Ptr kepada cawangan apabila nilai ialah integer.
Untuk mengelakkan isu ini, perlu meletakkan " if constexpr" dalam fungsi templat atau berikan maklumat jenis eksplisit kepada fungsi bukan templat untuk memastikan potongan jenis masa kompilasi.
Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menggunakan `if constexpr` dalam Fungsi Bukan Templat dalam C 17?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!