Heim >Backend-Entwicklung >C++ >Unterscheidet sich das Verhalten von „static_assert' bei der Template-Instanziierung zwischen GCC und Clang?

Unterscheidet sich das Verhalten von „static_assert' bei der Template-Instanziierung zwischen GCC und Clang?

DDD
DDDOriginal
2024-11-05 01:10:01593Durchsuche

Does `static_assert` Behavior Vary in Template Instantiation Between GCC and Clang?

Bewertung des static_assert-Verhaltens bei der Vorlageninstanziierung

In diesem Code wird ein static_assert verwendet, um den Wert des nicht typisierten Vorlagenparameters zu validieren Antwort. Das Verhalten dieser Behauptung variiert jedoch zwischen gcc und clang:

<code class="cpp">template <int answer> struct Hitchhiker {
  static_assert(sizeof(answer) != sizeof(answer), "Invalid answer");
};

template <> struct Hitchhiker<42> {};</code>

Verhalten von gcc:

gcc löst die Behauptung nur aus, wenn Hitchhiker mit einem anderen Parameter als instanziiert wird 42.

clangs Verhalten:

clang löst den Assertionsfehler aus, auch wenn die Vorlage nicht explizit instanziiert wird.

Standardinterpretation:

Der C-Standard besagt, dass eine Vorlage als fehlerhaft gilt, wenn sie keine gültigen Spezialisierungen aufweist und nicht instanziiert wird. Dies bedeutet, dass keine Diagnose erforderlich ist.

Analyse:

Beide Compiler verhalten sich korrekt. Clang entscheidet sich dafür, eine Diagnose bereitzustellen, obwohl der Standard dies nicht erfordert.

Alternativer Ansatz:

Um nur eine Antwort von 42 zu ermöglichen, kann die allgemeine Vorlage weggelassen werden , und die spezialisierte Vorlage ist wie folgt definiert:

<code class="cpp">template <> struct Hitchhiker<42> {};</code>

Das obige ist der detaillierte Inhalt vonUnterscheidet sich das Verhalten von „static_assert' bei der Template-Instanziierung zwischen GCC und Clang?. 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