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

Können wir ohne Deklarationen feststellen, ob ein C 11-Ausdruck zur Kompilierungszeit „constexpr' ist?

Susan Sarandon
Freigeben: 2024-12-02 12:58:11
Original
964 Leute haben es durchsucht

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

Verwendung von constexpr in C 11: Bestimmen konstanter Ausdrücke

Frage:

Ist es machbar? um festzustellen, ob ein C 11-Ausdruck währenddessen als konstanter Ausdruck (constexpr) qualifiziert ist Kompilierungszeit, ohne auf Deklarationen angewiesen zu sein?

Antwort:

Mit dem noexclusive-Operator ist es möglich, einen booleschen Wert zur Kompilierungszeit zu erstellen, der angibt, ob ein Ausdruck einen Ausdruck darstellt constexpr:

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

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

Erklärung:

Der Ausdruck noexclusive(e) validiert die folgenden Bedingungen:

  • Das Fehlen von Funktionsaufrufen mit nicht-auslösenden Ausnahmespezifikationen oder Variablenaufrufen, die keine konstanten Ausdrücke darstellen.
  • Kein Vorhandensein von „throw“ Ausdrücke.
  • Keine dynamischen Casts oder Typeids in Form von Throwables.

Einschränkungen:

Aufgrund der konservativen Natur von „potenziell Bei „evalued“-Ausdrücken kann es vorkommen, dass „noexclusive“ falsch-negative Ergebnisse liefert. Zum Beispiel:

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

In diesem Fall wird a erfolgreich initialisiert, aber atest wird als falsch ausgewertet, da der Wurfausdruck möglicherweise ausgewertet wird, auch wenn er nie ausgeführt wird.

Das obige ist der detaillierte Inhalt vonKönnen wir ohne Deklarationen feststellen, ob ein C 11-Ausdruck zur Kompilierungszeit „constexpr' ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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