Bestimmen von Consexpr-Ausdrücken in C 11
Frage: Ist es möglich zu bestimmen, ob ein C 11-Ausdruck ein ist konstanter Ausdruck (constexpr) bei Kompilierzeit?
Antwort: Ja, es ist mit der folgenden Technik möglich:
template<typename T> constexpr typename remove_reference<T>::type makeprval(T&& t) { return t; } #define isprvalconstexpr(e) noexcept(makeprval(e))
Erklärung:
Das isprvalconstexpr-Makro nimmt einen Ausdruck e an und gibt true zurück, wenn e ein konstanter Ausdruck vom Typ prvalue ist (d. h., es kann sein). zur Kompilierungszeit ausgewertet). Dies wird mithilfe des Operators „noexclusive“ bestimmt, der „false“ zurückgibt, wenn e potenziell ausgewertete Funktionsaufrufe enthält, die keine nicht auslösende Ausnahmespezifikation, keine Auslöseausdrücke oder auslösbare dynamische Umwandlungen oder Typ-IDs haben.
Einschränkungen:
Es ist wichtig zu beachten, dass diese Technik eine Einschränkung aufweist. Der noexclusive-Operator kann manchmal falsch-negative Ergebnisse liefern, was bedeutet, dass er möglicherweise meldet, dass ein Ausdruck kein konstanter Ausdruck ist, obwohl dies der Fall ist. Dies geschieht, wenn die „potenziell ausgewerteten“ Ausdrücke in e nicht tatsächlich ausgewertet werden, was unter bestimmten Umständen passieren kann, obwohl sie formal als potenziell ausgewertet gelten.
Das obige ist der detaillierte Inhalt vonWie können wir feststellen, ob ein C 11-Ausdruck zur Kompilierungszeit ein „constexpr' ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!