Heim >Backend-Entwicklung >C++ >Kann C 11 feststellen, ob ein Ausdruck eine Konstante zur Kompilierungszeit ist?

Kann C 11 feststellen, ob ein Ausdruck eine Konstante zur Kompilierungszeit ist?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-05 06:04:11998Durchsuche

Can C  11 Determine if an Expression is a Compile-Time Constant?

Ist constexpr in C 11 möglich?

Frage:

Kann C 11 feststellen, ob Ein Ausdruck ist ein konstanter Ausdruck zur Kompilierungszeit (constexpr)?

Antwort:

Ja, es ist möglich, einen booleschen Wert zur Kompilierungszeit basierend auf dieser Bestimmung mit der folgenden Technik zu erzeugen:

template<typename T> 
constexpr typename remove_reference<T>::type makeprval(T &&& t) {
  return t;
}

#define isprvalconstexpr(e) noexcept(makeprval(e))

Dieses Makro prüft mithilfe des NoException-Operators, ob der Ausdruck e ein Wertkonstantenausdruck ist. Wenn noexclusive(makeprval(e)) true ergibt, ist der Ausdruck e ein Wertkonstantenausdruck.

Erklärung:

Für Wertkonstantenausdrücke gelten bestimmte Einschränkungen:

  • Funktionsaufrufe dürfen nicht auslösend sein Ausnahmespezifikationen.
  • Wurfausdrücke sind verboten.
  • Dynamische Umwandlungen und Typid-Ausdrücke müssen in einer nicht ausführbaren Form vorliegen.

Die Funktion makeprval ist nicht deklariert als noexclusive. Wenn also e ein konstanter Ausdruck vom Typ prvalue ist, ist der Aufruf von makeprval(e) ein konstanter Ausdruck. Daher gibt der Operator „noexclusive“ „true“ zurück.

Einschränkungen:

Das isprvalconstexpr-Makro weist einige Einschränkungen auf:

  • Es kann zu falsch-negativen Ergebnissen führen in Fällen, in denen der Ausdruck ein konstanter Ausdruck ist, die Unterausdrücke jedoch möglicherweise ausgewertet werden, jedoch nicht tatsächlich ausgewertet.
  • Es wird nur nach prvalue-Konstantenausdrücken gesucht, nicht nach allgemeinen constexpr-Ausdrücken.

Das obige ist der detaillierte Inhalt vonKann C 11 feststellen, ob ein Ausdruck eine Konstante zur Kompilierungszeit 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