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
Susan SarandonOriginal
2024-12-02 12:58:11969Durchsuche

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))

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

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!

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