Heim >Backend-Entwicklung >C++ >Warum verursacht „reinterpret_cast' einen Kompilierungsfehler beim Initialisieren einer „constexpr'-Variablen?
constexpr und reinterpret_cast: Fehler bei der C-Kompilierung
Bedenken Sie den folgenden Codeausschnitt:
<br>struct foo {<br> static constexpr const void<em> ptr = reinterpret_cast<const void</em>>(0x1);<br>};<br>
Dieser Code lässt sich in g v4.9 ohne Fehler kompilieren, aber schlägt in clang v3.4 mit dem fehl Fehler:
error: constexpr variable 'ptr' must be initialized by a constant expression
Welcher Compiler ist richtig?
Nach dem C 11-Standard ist Clang korrekt. Der Standard besagt, dass ein konstanter Ausdruck keinen reinterpret_cast beinhalten darf. Dies bedeutet, dass die Initialisierung von ptr im Codeausschnitt ungültig ist.
Richtige Initialisierung
Die richtige Art, einen Ausdruck dieses Typs zu deklarieren, wäre die Verwendung einer Alternative Methode, wie zum Beispiel:
<br>struct foo {<br> static constexpr intptr_t ptr = 0x1;<br>};<br>
Dies würde sowohl in clang als auch in g funktionieren.
Workaround für GCC
Während die Annahme des ursprünglichen Codeausschnitts durch GCC technisch falsch ist, unterstützt es ihn doch eine Problemumgehung mit dem Makro __builtin_constant_p:
<br>struct foo {<br> static constexpr const void* ptr =</p> <pre class="brush:php;toolbar:false">__builtin_constant_p( reinterpret_cast<const void*>(0x1) ) ? reinterpret_cast<const void*>(0x1) : reinterpret_cast<const void*>(0x1);
};
pre>
Diese Problemumgehung ermöglicht es GCC, das zu falten nichtkonstanter Ausdruck und behandelt ihn als Konstante. Es ist jedoch nicht Teil des C-Standards und sollte mit Vorsicht verwendet werden.
Das obige ist der detaillierte Inhalt vonWarum verursacht „reinterpret_cast' einen Kompilierungsfehler beim Initialisieren einer „constexpr'-Variablen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!