constexpr and Initialization of a Static const Void Pointer with reinterpret cast: Compiler Discrepancy
Coretan kod berikut menggambarkan isu:
struct foo { static constexpr const void* ptr = reinterpret_cast<const void*>(0x1); };
Penyusun Percanggahan
Walaupun kod ini berjaya dikompil dalam g v4.9, ia gagal dihimpun dalam clang v3.4. Clang menjana ralat:
error: constexpr variable 'ptr' must be initialized by a constant expression
Pematuhan Standard
Menurut piawai C 11, pembolehubah constexpr mesti dimulakan dengan ungkapan malar. Reinterpret_cast bukanlah ungkapan tetap, seperti yang dinyatakan dalam seksyen 5.19 perenggan 2 draf piawai C 11. Oleh itu, clang adalah betul dalam menolak kod.
Pengisytiharan Betul
Cara yang betul untuk mengisytiharkan pembolehubah constexpr dengan hantaran tafsir semula ialah menggunakan makro __builtin_constant_p. Makro ini membenarkan lipatan berterusan bagi ungkapan tidak tetap. Kod yang diubah suai berikut disusun dalam kedua-dua g dan dentang:
static constexpr const void* ptr = __builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ? reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1) ;
Kod ini menggunakan operator bersyarat ternary untuk menguji sama ada ungkapan hantaran mentafsir semula ialah ungkapan malar. Jika benar, pelakon dilakukan, jika tidak, penilaian gagal.
Atas ialah kandungan terperinci Bolehkah `reinterpret_cast` digunakan untuk memulakan penuding void const statik `constexpr`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!