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!