Rumah > Artikel > pembangunan bahagian belakang > Mengapa "if constexpr" Menyebabkan Ralat Penyusunan dalam Fungsi Bukan Templat dalam C 17?
Ralat Menggunakan "If constexpr" dalam Fungsi Bukan Templat dalam C 17
Dalam C 17, pernyataan "if constexpr" membenarkan untuk menilai dan menyusun kod secara bersyarat berdasarkan ungkapan malar. Walau bagaimanapun, ciri ini mempunyai had apabila digunakan dalam fungsi bukan templat.
Kod:
<code class="cpp">#include <iostream> #include <type_traits> void print(auto value) { if constexpr (std::is_pointer_v<decltype(value)>) std::cout << "Ptr to " << *value << std::endl; else std::cout << "Ref to " << value << std::endl; }</code>
Masalah:
Apabila "if constexpr" digunakan dalam fungsi bukan templat, seperti yang ditunjukkan di atas, ralat kompilasi berlaku apabila cuba menyahrujuk nilai bukan penuding. Ralat ini timbul kerana, tidak seperti dalam fungsi templat, "if constexpr" dalam fungsi bukan templat tidak menghalang penyusunan laluan kod yang tidak diambil.
Penjelasan:
Dalam fungsi templat, "if constexpr" membenarkan kod disusun secara bersyarat berdasarkan nilai parameter templat. Dalam kes ini, pengkompil boleh menentukan pada masa penyusunan sama ada templat itu sah untuk pengkhususan tertentu dan hanya membuat seketika laluan kod yang diperlukan.
Walau bagaimanapun, dalam fungsi bukan templat, "if constexpr" bertindak hanya sebagai pernyataan bersyarat pada masa jalan. Pengkompil masih menganalisis kedua-dua cawangan pernyataan bersyarat dan jika mana-mana kod dalam cawangan yang tidak diambil adalah tidak sah, ralat penyusunan akan berlaku.
Penyelesaian:
Untuk mengelakkan ralat ini, gunakan "if constexpr" hanya dalam fungsi templat atau dalam fungsi bukan templat yang jenisnya diketahui pada masa penyusunan dan dijamin sah untuk kedua-dua cabang pernyataan bersyarat.
Atas ialah kandungan terperinci Mengapa "if constexpr" Menyebabkan Ralat Penyusunan dalam Fungsi Bukan Templat dalam C 17?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!