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

Susan Sarandon
Lepaskan: 2024-11-13 07:14:02
asal
455 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!

sumber:php.cn
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