Heim >Backend-Entwicklung >C++ >Kann „reinterpret_cast' verwendet werden, um einen statischen const void-Zeiger „constexpr' zu initialisieren?

Kann „reinterpret_cast' verwendet werden, um einen statischen const void-Zeiger „constexpr' zu initialisieren?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-30 03:19:10974Durchsuche

Can `reinterpret_cast` be used to initialize a `constexpr` static const void pointer?

constexpr und Initialisierung eines statischen const-Void-Zeigers mit neu interpretierter Umwandlung: Compiler-Diskrepanz

Der folgende Codeausschnitt veranschaulicht das Problem:

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

Compiler Diskrepanz

Während dieser Code in g v4.9 erfolgreich kompiliert werden kann, schlägt die Kompilierung in clang v3.4 fehl. Clang generiert den Fehler:

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

Standard Compliance

Gemäß dem C 11-Standard muss eine constexpr-Variable durch einen konstanten Ausdruck initialisiert werden. Reinterpret_cast ist kein konstanter Ausdruck, wie in Abschnitt 5.19 Absatz 2 des Entwurfs des C 11-Standards angegeben. Daher hat clang Recht, den Code abzulehnen.

Richtige Deklaration

Der richtige Weg, eine constexpr-Variable mit einer Reinterpret-Umwandlung zu deklarieren, ist die Verwendung des Makros __builtin_constant_p. Dieses Makro ermöglicht die konstante Faltung nicht konstanter Ausdrücke. Der folgende geänderte Code wird sowohl in g als auch in clang kompiliert:

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

Dieser Code verwendet den ternären Bedingungsoperator, um zu testen, ob der neu interpretierte Umwandlungsausdruck ein konstanter Ausdruck ist. Wenn „true“, wird die Umwandlung durchgeführt, andernfalls schlägt die Auswertung fehl.

Das obige ist der detaillierte Inhalt vonKann „reinterpret_cast' verwendet werden, um einen statischen const void-Zeiger „constexpr' 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