Statische Assert mit Nicht-Typ-Vorlagenparametern
In C wird static_assert verwendet, um Bedingungen zur Kompilierungszeit zu überprüfen. Allerdings weisen verschiedene Compiler unterschiedliche Verhaltensweisen auf, wenn static_assert mit nicht typspezifischen Vorlagenparametern verwendet wird.
Problem:
Der folgende Codeausschnitt:
<code class="cpp">template <int answer> struct Hitchhiker { static_assert(sizeof(answer) != sizeof(answer), "Invalid answer"); }; template <> struct Hitchhiker<42> {};</code>
erzeugt unterschiedliche Ergebnisse, wenn es mit GCC und Clang kompiliert wird. In GCC wird der Assertionsfehler nur generiert, wenn Hitchhiker mit einem anderen Parameter als 42 instanziiert wird. In Clang wird der Assertionsfehler auch dann generiert, wenn die Vorlage nicht instanziiert wird.
Ändern der Assertion wie folgt:
<code class="cpp">template <int answer> struct Hitchhiker { static_assert(sizeof(int[answer]) != sizeof(int[answer]), "Invalid answer"); }; template <> struct Hitchhiker<42> {};</code>
führt zu einem konsistenten Verhalten zwischen beiden Compilern, wobei die Behauptung nur während der Vorlageninstanziierung überprüft wird.
Antwort:
Gemäß dem C-Standard ( [temp.res]/8) gilt eine nicht instanziierte Vorlage ohne gültige Spezialisierungen als fehlerhaft, ohne dass eine Diagnose erforderlich ist.
Schlussfolgerung:
In Im Fall des Originalcodes entscheidet sich GCC dafür, keine Diagnose für die nicht instanziierte Vorlage auszugeben. Clang hingegen beschließt, eine Diagnose auszugeben, obwohl der Standard dies nicht vorschreibt. Das Verhalten des geänderten Codes ist zwischen den Compilern konsistenter, da die Behauptung nur überprüft wird, wenn die Vorlage tatsächlich instanziiert wird.
Es ist wichtig zu beachten, dass das Vorhandensein oder Fehlen einer Diagnose in diesem Szenario keinen Fehler anzeigt im Code. Die nicht instanziierte Vorlage ist von Natur aus fehlerhaft und jeder Versuch, sie mit einer ungültigen Spezialisierung zu instanziieren, führt zu einem Kompilierungsfehler.
Das obige ist der detaillierte Inhalt vonWarum verhält sich „static_assert' mit Nicht-Typ-Vorlagenparametern in GCC und Clang unterschiedlich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!