Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah reinterpret_cast of a Literal Valed for Initializing a constexpr Static Const Void Pointer?

Adakah reinterpret_cast of a Literal Valed for Initializing a constexpr Static Const Void Pointer?

Linda Hamilton
Linda Hamiltonasal
2024-11-13 03:32:02732semak imbas

Is reinterpret_cast of a Literal Valid for Initializing a constexpr Static Const Void Pointer?

constexpr dan Initialization of a Static Const Void Pointer dengan tafsiran semula cast: Penyusun manakah yang Betul?

Perihalan Masalah

Pertimbangkan coretan kod berikut:

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

auto main() -> int {
  return 0;
}

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

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

Soalan

  1. Yang manakah pengkompil adalah betul mengikut piawai?
  2. Apakah cara yang betul untuk mengisytiharkan ungkapan sedemikian?

Jawapan

  1. clang Compiler ialah Betul

Menurut bahagian standard C 11 5.19 (Ungkapan Malar), ungkapan bersyarat tidak dianggap sebagai ungkapan malar teras apabila ia melibatkan reinterpret_cast. Oleh itu, clang adalah betul dalam membenderakan kod ini sebagai ralat.

  1. Pengisytiharan Betul

Penyelesaian mudah ialah menggunakan intptr_t dan hantar ke void* apabila diperlukan:

static constexpr intptr_t ptr = 0x1;
reinterpret_cast<void*>(foo::ptr);

Walau bagaimanapun, gcc dan clang menyokong penyelesaian tanpa dokumen menggunakan __builtin_constant_p untuk membenarkan lipatan berterusan ungkapan bukan tetap:

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

Atas ialah kandungan terperinci Adakah reinterpret_cast of a Literal Valed for Initializing a constexpr Static Const Void Pointer?. 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