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
Patricia Arquetteasal
2024-11-30 03:19:101052semak imbas

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);
};

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

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)  ;

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!

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