Heim >Backend-Entwicklung >C++ >Ist reinterpret_cast eines Literals für die Initialisierung eines constexpr Static Const Void Pointers gültig?
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
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.
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!