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:
template
struct Hitchhiker {
static_assert(sizeof(answer) != sizeof(answer), "Invalid answer");
};
template
struct Hitchhiker {};
verhält sich auf Clang und GCC unterschiedlich, wenn versucht wird, die allgemeine Vorlageninstanziierung mithilfe von static_assert zu deaktivieren. Clang löst den Assert-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, empfiehlt es sich, die allgemeine Vorlagendefinition wie folgt wegzulassen:
template
struct Hitchhiker {};
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3