Pernyataan Statik dalam Gagal Constexpr if Block
Pengenalan
constexpr jika diperkenalkan dalam C 17 membolehkan kod yang lebih ringkas dan cekap. Walau bagaimanapun, ia juga menimbulkan persoalan mengenai pengendalian pernyataan static_assert dalam blok if ini.
Kegagalan Penegasan Statik dalam Cawangan Tidak Diambil
Teks standard menyatakan bahawa static_assert kenyataan tidak terbentuk dalam cabang pernyataan constexpr if yang tidak diambil. Ini terpakai tidak kira sama ada syarat itu bergantung atau tidak.
Peraturan Dasar
Larangan ini adalah berdasarkan peraturan yang mantap untuk templat, yang menyatakan bahawa program adalah NDR yang tidak betul (tiada diagnostik diperlukan) jika tiada pengkhususan yang sah boleh dijana untuk templat. Static_asserts dengan syarat tidak bergantung yang dinilai sebagai palsu termasuk dalam kategori ini.
Impak terhadap Keselamatan dan Kegunaan
Penghadan ini meletakkan kekangan yang ketara terhadap keselamatan dan kegunaan constexpr jika . Pembangun mesti mengetahui sebarang kemungkinan static_asserts yang mungkin dipanggil dalam cabang pernyataan if yang tidak diambil.
Contoh
Kod berikut disusun tanpa amaran tetapi adalah dianggap tidak berbentuk:
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>(); }
Skop Peraturan
Larangan terhadap static_asserts meliputi graf panggilan, jadi sebarang fungsi yang dipanggil dalam cawangan tidak diambil yang mungkin mengandungi static_asserts juga adalah dilarang.
Kesimpulan
Kegagalan static_asserts dalam cabang constexpr yang tidak diambil jika penyataan menyerlahkan keperluan untuk pertimbangan yang teliti apabila menggunakannya dalam templat. Pembangun mesti memastikan bahawa sebarang static_asserts dengan syarat tidak bergantung yang dinilai sebagai palsu tidak dicuba dalam cabang pernyataan if yang tidak diambil.
Atas ialah kandungan terperinci Apakah yang Berlaku kepada Penegasan Statik dalam Cawangan `constexpr if` yang Tidak Diambil?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!