Heim >Backend-Entwicklung >C++ >Wie können wir feststellen, ob ein C 11-Ausdruck zur Kompilierungszeit ein „constexpr' ist?

Wie können wir feststellen, ob ein C 11-Ausdruck zur Kompilierungszeit ein „constexpr' ist?

Linda Hamilton
Linda HamiltonOriginal
2024-12-03 17:42:13843Durchsuche

How Can We Determine if a C  11 Expression is a `constexpr` at Compile Time?

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!

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