Rumah >pembangunan bahagian belakang >C++ >Mengapakah `reinterpret_cast` Menyebabkan Ralat Penyusunan Apabila Memulakan Pembolehubah `constexpr`?

Mengapakah `reinterpret_cast` Menyebabkan Ralat Penyusunan Apabila Memulakan Pembolehubah `constexpr`?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-13 04:37:02777semak imbas

Why Does `reinterpret_cast` Cause a Compilation Error When Initializing a `constexpr` Variable?

constexpr and reinterpret_cast: Ralat dalam C Compilation

Pertimbangkan coretan kod berikut:


struct foo {
constexpr statik const void ptr = reinterpret_cast>(0x1);
};

Kod ini menyusun tanpa ralat dalam g v4.9, tetapi gagal dalam clang v3.4 dengan ralat:

error: constexpr variable 'ptr' must be initialized by a constant expression

Penyusun Mana Yang Betul?

Mengikut piawaian C 11, dentang adalah betul. Piawaian menyatakan bahawa ungkapan malar tidak boleh melibatkan reinterpret_cast. Ini bermakna permulaan ptr dalam coretan kod adalah tidak sah.

Permulaan yang Betul

Cara yang betul untuk mengisytiharkan ungkapan jenis ini ialah menggunakan alternatif kaedah, seperti:

<br>struct foo {<br> statik constexpr intptr_t ptr = 0x1;<br>};<br>

Ini akan berfungsi dalam kedua-dua clang dan g .

Penyelesaian untuk GCC

Sementara GCC menerima kod asal coretan secara teknikalnya tidak betul, ia menyokong penyelesaian menggunakan makro __builtin_constant_p:

<br>struct foo {<br> statik constexpr const void* ptr =</p>
<pre class="brush:php;toolbar:false">__builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ?
  reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1);

};

Penyelesaian ini membolehkan GCC melipat ungkapan tidak tetap dan menganggapnya sebagai pemalar. Walau bagaimanapun, ia bukan sebahagian daripada piawaian C dan harus digunakan dengan berhati-hati.

Atas ialah kandungan terperinci Mengapakah `reinterpret_cast` Menyebabkan Ralat Penyusunan Apabila 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