Rumah > pembangunan bahagian belakang > C++ > 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
Lepaskan: 2024-11-13 03:32:02
asal
804 orang telah melayarinya

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;
}
Salin selepas log masuk

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
Salin selepas log masuk

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);
Salin selepas log masuk

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);
Salin selepas log masuk

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!

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