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!