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
Linda HamiltonOriginal
2024-11-13 03:32:02799Durchsuche

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;
}

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

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);

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);

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!

Stellungnahme:
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