Rumah > pembangunan bahagian belakang > C++ > Bolehkah `reinterpret_cast` digunakan untuk memulakan penuding void const statik `constexpr`?

Bolehkah `reinterpret_cast` digunakan untuk memulakan penuding void const statik `constexpr`?

Patricia Arquette
Lepaskan: 2024-11-30 03:19:10
asal
1044 orang telah melayarinya

Can `reinterpret_cast` be used to initialize a `constexpr` static const void pointer?

constexpr and Initialization of a Static const Void Pointer with reinterpret cast: Compiler Discrepancy

Coretan kod berikut menggambarkan isu:

struct foo {
  static constexpr const void* ptr = reinterpret_cast<const void*>(0x1);
};
Salin selepas log masuk

Penyusun Percanggahan

Walaupun kod ini berjaya dikompil dalam g v4.9, ia gagal dihimpun dalam clang v3.4. Clang menjana ralat:

error: constexpr variable 'ptr' must be initialized by a constant expression
Salin selepas log masuk

Pematuhan Standard

Menurut piawai C 11, pembolehubah constexpr mesti dimulakan dengan ungkapan malar. Reinterpret_cast bukanlah ungkapan tetap, seperti yang dinyatakan dalam seksyen 5.19 perenggan 2 draf piawai C 11. Oleh itu, clang adalah betul dalam menolak kod.

Pengisytiharan Betul

Cara yang betul untuk mengisytiharkan pembolehubah constexpr dengan hantaran tafsir semula ialah menggunakan makro __builtin_constant_p. Makro ini membenarkan lipatan berterusan bagi ungkapan tidak tetap. Kod yang diubah suai berikut disusun dalam kedua-dua g dan dentang:

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

Kod ini menggunakan operator bersyarat ternary untuk menguji sama ada ungkapan hantaran mentafsir semula ialah ungkapan malar. Jika benar, pelakon dilakukan, jika tidak, penilaian gagal.

Atas ialah kandungan terperinci Bolehkah `reinterpret_cast` digunakan untuk memulakan penuding void const statik `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