Heim > Backend-Entwicklung > C++ > Ist reinterpret_cast eines Literals für die Initialisierung eines constexpr Static Const Void Pointers gültig?

Ist reinterpret_cast eines Literals für die Initialisierung eines constexpr Static Const Void Pointers gültig?

Linda Hamilton
Freigeben: 2024-11-13 03:32:02
Original
808 Leute haben es durchsucht

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

constexpr und Initialisierung eines statischen Const-Void-Zeigers mit Reinterpret-Cast: Welcher Compiler ist richtig?

Problembeschreibung

Beachten Sie den folgenden Codeausschnitt:

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

auto main() -> int {
  return 0;
}
Nach dem Login kopieren

Dieser Code wird in g v4.9 erfolgreich kompiliert, schlägt jedoch fehl in Clang v3.4 wird der Fehler generiert:

error: constexpr variable 'ptr' must be initialized by a constant expression
Nach dem Login kopieren

Fragen

  1. Welcher Compiler ist laut Standard korrekt?
  2. Was ist der richtige Weg? ein solches erklären Ausdruck?

Antwort

  1. clang Compiler ist korrekt

Gemäß dem C 11-Standardabschnitt 5.19 (Konstant Ausdrücke) gelten bedingte Ausdrücke nicht als Kernkonstantenausdrücke, wenn sie reinterpret_cast beinhalten. Daher hat clang Recht, diesen Code als Fehler zu kennzeichnen.

  1. Korrekte Deklaration

Eine einfache Lösung besteht darin, stattdessen intptr_t zu verwenden und in umzuwandeln void* bei Bedarf:

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

Gcc und clang unterstützen jedoch eine undokumentierte Problemumgehung Verwenden von __builtin_constant_p, um die konstante Faltung nicht konstanter Ausdrücke zu ermöglichen:

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

Das obige ist der detaillierte Inhalt vonIst reinterpret_cast eines Literals für die Initialisierung eines constexpr Static Const Void Pointers gültig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage