Bagaimanakah static_assert yang gagal memberi kesan kepada blok if constexpr (false)?
Static_assert dalam cawangan yang tidak diambil dari if constexpr pernyataan dianggap tidak betul, tanpa diagnostik diperlukan. Akibat ini berpunca daripada peraturan dalam [temp.res]/8, yang menganggap program tidak terbentuk jika tiada pengkhususan yang sah boleh dijana untuk templat atau substatement dalam pernyataan constexpr if.
Dalam kes ini daripada static_assert, jika syarat tidak bergantung dan dinilai palsu, tiada pengkhususan yang sah boleh dijana untuk templat yang mengandungi penegasan. Ini menjadikan program tidak berbentuk, walaupun cawangan tidak diambil.
Walau bagaimanapun, static_asserts dengan keadaan bergantung kekal tidak terjejas. Jika syarat boleh dinilai kepada benar untuk sekurang-kurangnya satu jenis, templat kekal sah.
Contoh
Pertimbangkan kod berikut:
template< typename T>< constexpr void other_library_foo(){ static_assert(std::is_same<T,int>::value); } template<class T> void g() { if constexpr (false) other_library_foo<T>(); } int main(){ g<float>(); g<int>(); }
Walaupun syarat constexpr palsu, kod tersebut masih tidak terbentuk kerana static_assert dalam other_library_foo mengandungi bukan bergantung keadaan yang menilai palsu.
Atas ialah kandungan terperinci Bagaimanakah `static_assert` yang Gagal dalam Blok `if constexpr` yang Tidak Diambil Mempengaruhi Kesahan Program?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!