Heim >Backend-Entwicklung >C++ >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?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-05 09:02:021041Durchsuche

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:

<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!

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