„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum verhält sich „static_assert“ bei nicht-typspezifischen Vorlagenparametern bei verschiedenen Compilern unterschiedlich?

Warum verhält sich „static_assert“ bei nicht-typspezifischen Vorlagenparametern bei verschiedenen Compilern unterschiedlich?

Veröffentlicht am 09.11.2024
Durchsuche:974

Why Does `static_assert` Behave Differently with Non-Type Template Parameters Across Compilers?

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 {};
Neuestes Tutorial Mehr>

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