Heim >Backend-Entwicklung >C++ >Können wir ohne Deklarationen feststellen, ob ein C 11-Ausdruck zur Kompilierungszeit „constexpr' ist?
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:
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!