Heim > Backend-Entwicklung > C++ > Ist mein C 11-Ausdruck ein „constexpr'?

Ist mein C 11-Ausdruck ein „constexpr'?

Linda Hamilton
Freigeben: 2024-12-02 20:32:15
Original
224 Leute haben es durchsucht

Is My C  11 Expression a `constexpr`?

Konstante Ausdrücke in C 11 erkennen

In C 11 ist es möglich zu bestimmen, ob ein Ausdruck ein konstanter Ausdruck (constexpr) ist Kompilierung, die für die Optimierung des Codes und die Sicherstellung bestimmter Eigenschaften von Vorteil sein kann.

Verwenden noexclusive(makeprval(e))

Eine Möglichkeit, festzustellen, ob ein Ausdruck ein konstanter Ausdruck ist, ist die Verwendung des folgenden Makros:

#define isprvalconstexpr(e) noexcept(makeprval(e))
Nach dem Login kopieren

wobei makeprval eine Vorlagenfunktion ist, die Nimmt einen Verweis auf einen Ausdruck als Eingabe und gibt einen Wert desselben zurück Typ.

Erklärung

Der Ausdruck noexclusive(e) gibt „false“ zurück, wenn e bestimmte Operationen enthält, die in konstanten Ausdrücken nicht zulässig sind, z. B. nicht auslösende Funktionsaufrufe. Wurfausdrücke und auswerfbare dynamische Umwandlungen oder Typ-IDs. Wenn der Aufruf von makeprval kein konstanter Ausdruck ist, gibt der noexclusive-Ausdruck ebenfalls false zurück.

Einschränkungen

Während isprvalconstexpr im Allgemeinen bei der Erkennung von prvalue-Konstantausdrücken effektiv ist, ist es hat eine subtile Einschränkung. In Fällen, in denen ein Ausdruck ein konstanter Ausdruck ist, aber möglicherweise ausgewertete Unterausdrücke enthält, die in konstanten Ausdrücken nicht zulässig sind, kann es zu falsch-negativen Ergebnissen kommen.

Beispielverwendung

Das folgende Beispiel demonstriert die Verwendung von isprvalconstexpr:

constexpr int a = (0 ? throw "fooled!" : 42);
constexpr bool atest = isprvalconstexpr((0 ? throw "fooled!" : 42));
Nach dem Login kopieren

In diesem Beispiel ist atest falsch, weil der Ausdruck (0 ? throw „fooled!“ : 42) ist kein konstanter Ausdruck, auch wenn die Initialisierung von a erfolgreich ist. Dies liegt daran, dass der „böse“ nicht konstante Unterausdruck „täuscht!“ auslöst. wird möglicherweise ausgewertet, auch wenn es in diesem speziellen Fall nie tatsächlich ausgewertet wird.

Das obige ist der detaillierte Inhalt vonIst mein C 11-Ausdruck ein „constexpr'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage