Heim >Backend-Entwicklung >C++ >Warum verursacht „reinterpret_cast' einen Kompilierungsfehler beim Initialisieren einer „constexpr'-Variablen?

Warum verursacht „reinterpret_cast' einen Kompilierungsfehler beim Initialisieren einer „constexpr'-Variablen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-13 04:37:02777Durchsuche

Why Does `reinterpret_cast` Cause a Compilation Error When Initializing a `constexpr` Variable?

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);

};

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!

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