Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bolehkah `reinterpret_cast` digunakan untuk memulakan pembolehubah `constexpr`?

Bolehkah `reinterpret_cast` digunakan untuk memulakan pembolehubah `constexpr`?

Susan Sarandon
Susan Sarandonasal
2024-11-13 07:14:02488semak imbas

Can `reinterpret_cast` be used to initialize a `constexpr` variable?

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!

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