Rumah > Artikel > pembangunan bahagian belakang > Adakah reinterpret_cast of a Literal Valed for Initializing a constexpr Static Const Void Pointer?
Pertimbangkan coretan kod berikut:
struct foo { static constexpr const void* ptr = reinterpret_cast<const void*>(0x1); }; auto main() -> int { return 0; }
Kod ini berjaya menyusun dalam g v4.9 tetapi gagal dalam clang v3.4, menghasilkan ralat:
error: constexpr variable 'ptr' must be initialized by a constant expression
Menurut bahagian standard C 11 5.19 (Ungkapan Malar), ungkapan bersyarat tidak dianggap sebagai ungkapan malar teras apabila ia melibatkan reinterpret_cast. Oleh itu, clang adalah betul dalam membenderakan kod ini sebagai ralat.
Penyelesaian mudah ialah menggunakan intptr_t dan hantar ke void* apabila diperlukan:
static constexpr intptr_t ptr = 0x1; reinterpret_cast<void*>(foo::ptr);
Walau bagaimanapun, gcc dan clang menyokong penyelesaian tanpa dokumen menggunakan __builtin_constant_p untuk membenarkan lipatan berterusan ungkapan bukan tetap:
static constexpr const void* ptr = __builtin_constant_p(reinterpret_cast<const void*>(0x1)) ? reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1);
Atas ialah kandungan terperinci Adakah reinterpret_cast of a Literal Valed for Initializing a constexpr Static Const Void Pointer?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!