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

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

Susan Sarandon
Lepaskan: 2024-11-13 07:14:02
asal
550 orang telah melayarinya

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);
};
Salin selepas log masuk

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
Salin selepas log masuk

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;
Salin selepas log masuk

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);
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan