Heim >Backend-Entwicklung >C++ >Warum verhält sich „static_assert' bei nicht-typspezifischen Vorlagenparametern bei verschiedenen Compilern unterschiedlich?
Inkonsistentes Verhalten von static_assert mit Nicht-Typ-Vorlagenparametern über Compiler hinweg
In C kann ein static_assert verwendet werden, um Bedingungen zur Kompilierungszeit zu überprüfen . Eine aktuelle Beobachtung hat jedoch eine Ungleichheit im Verhalten von static_assert ergeben, wenn es in Verbindung mit nicht-typspezifischen Vorlagenparametern über verschiedene Compiler hinweg verwendet wird.
Im Einzelnen das folgende Codefragment:
<code class="cpp">template <int answer> struct Hitchhiker { static_assert(sizeof(answer) != sizeof(answer), "Invalid answer"); }; template <> struct Hitchhiker<42> {};</code>
verhält sich auf Clang und GCC unterschiedlich, wenn versucht wird, die allgemeine Vorlageninstanziierung mithilfe von static_assert zu deaktivieren. Clang löst den Assertion-Fehler auch dann aus, wenn die Vorlage nicht instanziiert ist, während GCC den Fehler nur bei Instanziierung mit einem anderen Parameterwert als 42 auslöst.
Um die Diskrepanz zu verstehen, untersuchen wir den relevanten Abschnitt des C-Standards ( [temp.res]/8):
If no valid specialization can be generated for a template, and that template is not instantiated, the template is ill-formed, no diagnostic required.
Gemäß dieser Regel ist die primäre Vorlage Hitchhiker fehlerhaft, da keine gültige Spezialisierung generiert werden kann. Daher ist es nicht erforderlich, eine Diagnose auszustellen. Clang entscheidet sich jedoch dafür, trotz fehlender Anforderung eine Diagnose bereitzustellen.
Wenn die Instanziierung auf nur 42 beschränkt werden soll, wird empfohlen, die allgemeine Vorlagendefinition wie folgt wegzulassen:
<code class="cpp">template <> struct Hitchhiker<42> {};</code>
Das obige ist der detaillierte Inhalt vonWarum verhält sich „static_assert' bei nicht-typspezifischen Vorlagenparametern bei verschiedenen Compilern unterschiedlich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!