Heim >Backend-Entwicklung >C++ >Kann „reinterpret_cast' verwendet werden, um eine „constexpr'-Variable zu initialisieren?

Kann „reinterpret_cast' verwendet werden, um eine „constexpr'-Variable zu initialisieren?

Susan Sarandon
Susan SarandonOriginal
2024-11-13 07:14:02501Durchsuche

Can `reinterpret_cast` be used to initialize a `constexpr` variable?

constexpr-Variableninitialisierung mit reinterpret_cast und Compiler-Kompatibilität

Beachten Sie den folgenden Codeausschnitt:

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

Beim Kompilieren mit g v4.9, dieser Code wurde erfolgreich kompiliert. Clang v3.4 kann jedoch nicht kompiliert werden und gibt den folgenden Fehler aus:

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

Compiler-Korrektheit

Gemäß dem C 11-Standardentwurf (Abschnitt 5.19, Absatz 2 ), wird ein bedingter Ausdruck nicht als konstanter Ausdruck betrachtet, wenn er einen reinterpret_cast beinhaltet. Daher ist die Interpretation von clang richtig, dass die Initialisierung von ptr nicht gültig ist.

Richtige Deklaration

Um einen konstanten Ausdruck dieser Art richtig zu deklarieren, sollte man verwenden intptr_t stattdessen und bei Bedarf umwandeln:

static constexpr intptr_t ptr = 0x1;

Alternativ besteht eine von gcc und clang unterstützte Problemumgehung in der Verwendung von undokumentiertes __builtin_constant_p-Makro:

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

Dieser Ausdruck wird von beiden Compilern aufgrund der __builtin_constant_p-Prüfung akzeptiert, die eine Konstantfaltung des Ausdrucks erzwingt.

Das obige ist der detaillierte Inhalt vonKann „reinterpret_cast' verwendet werden, um eine „constexpr'-Variable zu initialisieren?. 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