Rumah > Artikel > pembangunan bahagian belakang > Bolehkah `reinterpret_cast` digunakan untuk memulakan pembolehubah `constexpr`?
Constexpr Variable Initialization dengan reinterpret_cast dan Keserasian Pengkompil
Pertimbangkan coretan kod berikut:
struct foo { static constexpr const void* ptr = reinterpret_cast<const void*>(0x1); };
Apabila disusun dengan g v4.9, kod ini berjaya disusun. Walau bagaimanapun, clang v3.4 gagal untuk menyusun, mengeluarkan ralat:
error: constexpr variable 'ptr' must be initialized by a constant expression
Ketepatan Pengkompil
Mengikut piawaian draf C 11 (bahagian 5.19, perenggan 2 ), ungkapan bersyarat tidak dianggap sebagai ungkapan malar jika ia melibatkan reinterpret_cast. Oleh itu, clang adalah betul dalam tafsirannya bahawa pemulaan ptr tidak sah.
Pengisytiharan Betul
Untuk mengisytiharkan ungkapan tetap sifat ini dengan betul, seseorang harus menggunakan intptr_t sebaliknya dan hantar apabila perlu:
static constexpr intptr_t ptr = 0x1;
Sebagai alternatif, penyelesaian yang disokong oleh kedua-dua gcc dan clang melibatkan penggunaan makro __builtin_constant_p tidak berdokumen:
static constexpr const void* ptr = __builtin_constant_p(reinterpret_cast<const void*>(0x1)) ? reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1);
Ungkapan ini diterima oleh kedua-dua penyusun kerana kepada semakan __builtin_constant_p, yang memaksa ungkapan dilipat malar.
Atas ialah kandungan terperinci Bolehkah `reinterpret_cast` digunakan untuk memulakan pembolehubah `constexpr`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!