Rumah >pembangunan bahagian belakang >C++ >Mengapakah Penegasan Statik Gagal dalam Blok `constexpr if (false)` C 17?

Mengapakah Penegasan Statik Gagal dalam Blok `constexpr if (false)` C 17?

DDD
DDDasal
2024-11-25 20:33:13421semak imbas

Why Do Static Assertions Fail in C  17's `constexpr if (false)` Blocks?

Kelakuan Static_Assert Gagal dalam Constexpr If (False) Blocks

Pengenalan constexpr if dalam C 17 telah menimbulkan kebimbangan tentang tingkah laku static_asserts dalam cawangan yang tidak diambil ini penyata.

Menurut piawaian C, apabila pernyataan konstexpr jika muncul dalam entiti templat, penyataan yang dibuang dalam cawangan tidak diambil tidak akan dibuat seketika. Peraturan ini melarang pelaksanaan static_asserts dengan syarat palsu tidak bergantung semasa instantiasi templat, dengan berkesan menganggap program tidak terbentuk.

Tingkah laku ini berpunca daripada peraturan yang lebih umum yang digunakan untuk semua templat: jika tiada pengkhususan yang sah boleh dihasilkan untuk templat dengan substatement dalam constexpr jika nilai itu palsu, program itu dianggap tidak berbentuk, tidak kira sama ada templat itu instantiated.

Sebagai contoh, kod berikut adalah bentuk yang tidak betul, walaupun ia menyusun tanpa amaran menggunakan versi terbaru Clang:

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>(); 
}

Tingkah laku ini meliputi panggilan tidak langsung ke static_asserts. Jika fungsi constexpr (template) mengandungi static_assert dengan syarat palsu yang tidak bergantung, ia tidak boleh dipanggil dalam cabang tidak diambil bagi pernyataan constexpr if, walaupun dalam templat yang berasingan.

Implikasi dan Langkah Berjaga-jaga

Penghadan pada static_asserts dalam constexpr jika blok (palsu) boleh memberi kesan kepada keselamatan dan kegunaan constexpr jika sebagai pengganti SFINAE. Pembangun mesti mengetahui sebarang potensi penggunaan static_asserts dalam fungsi atau pustaka yang mungkin digunakan secara tidak langsung dalam cabang kenyataan tersebut yang tidak diambil.

Akibatnya, adalah dinasihatkan untuk mengelak daripada menggunakan static_asserts dalam kod yang mungkin dilaksanakan sebagai sebahagian daripada blok constexpr if (false). Amalan ini memastikan atur cara kekal dalam bentuk yang baik dan mengelakkan amaran atau ralat pengkompil yang berpotensi.

Atas ialah kandungan terperinci Mengapakah Penegasan Statik Gagal dalam Blok `constexpr if (false)` C 17?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn