Rumah >pembangunan bahagian belakang >C++ >Adakah undang-undang untuk memulakan penunjuk statik constexpr const void menggunakan reinterpret_cast?

Adakah undang-undang untuk memulakan penunjuk statik constexpr const void menggunakan reinterpret_cast?

Linda Hamilton
Linda Hamiltonasal
2024-11-12 03:35:01983semak imbas

Is it legal to initialize a static constexpr const void pointer using reinterpret_cast?

constexpr dan Initialization of a Static const void Pointer with reinterpret_cast: Compiler Differences Explained

Dalam coretan kod yang diberikan, constexpr const void void penunjuk diisytiharkan menggunakan reinterpret_cast. Kod ini menimbulkan persoalan tentang tafsiran pengkompil yang betul mengikut piawaian dan cara yang betul untuk mengisytiharkan ungkapan tersebut.

Kebenaran Pengkompil

Piawaian menentukan bahawa constexpr pembolehubah, seperti penuding void const statik dalam kes ini, mesti dimulakan dengan ungkapan malar. Ungkapan reinterpret_cast, walau bagaimanapun, tidak dianggap sebagai ungkapan pemalar teras mengikut piawaian C 11. Oleh itu, clang adalah betul dalam melaporkan ralat untuk kod ini.

Pengisytiharan Betul

Untuk mengisytiharkan penunjuk constexpr const void statik dengan betul, terdapat ialah beberapa pilihan:

  1. Gunakan intptr_t sebaliknya: Gunakan jenis intptr_t dan hantarkannya ke penunjuk kosong apabila mendapatkan semula nilai, seperti berikut:

    static constexpr intptr_t ptr = 0x1;
    // ...
    reinterpret_cast<void*>(ptr);
  2. Pelanjutan GCC/clang: GCC dan clang menyokong sambungan yang didokumentasikan sedikit menggunakan __builtin_constant_p:

    static constexpr const void* ptr = 
      __builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ? 
        reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1) ;

Ini ungkapan akan dilipat malar oleh kedua-dua penyusun. Walau bagaimanapun, ambil perhatian bahawa sambungan ini bukan sebahagian daripada standard dan mungkin tidak disokong dalam versi pengkompil akan datang.

Atas ialah kandungan terperinci Adakah undang-undang untuk memulakan penunjuk statik constexpr const void menggunakan reinterpret_cast?. 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