Ich habe einige kurze constexpr
-Funktionen in meinen Bibliotheken, die einige einfache Berechnungen durchführen. Ich verwende sie sowohl in Laufzeit- als auch in Kompilierungskontexten.
Ich möchte einige Behauptungen im Rumpf dieser Funktionen ausführen, jedoch ist assert(...)
in einer Funktion constexpr
nicht gültig und static_assert(...)
kann nicht zur Überprüfung von Funktionsparametern verwendet werden.
Beispiel:
%Vor% Gibt es eine Möglichkeit, zu prüfen , ob die Funktion in einer Laufzeit- oder Kompilierzeitkonstante ausgeführt wird und assert
nur dann ausführt, wenn sie zur Laufzeit ausgeführt wird?
Ich glaube, dass assert
für Sie funktioniert, sobald g ++ implementiert N3652, Entspannte Einschränkungen für constexpr-Funktionen . Derzeit zeigt diese Statusseite an, dass dies noch nicht implementiert wurde.
assert
funktioniert (in conexpr-Funktionen) auf dem aktuellen clang-Compiler von Apple mit -std=c++1y
.
Zu diesem Zeitpunkt sehe ich in der Norm nichts, das sicherstellt, dass assert
in conexpr-Funktionen funktioniert, und eine solche Zusicherung wäre eine willkommene Ergänzung des Standards (zumindest für mich).
Aktualisieren
Richard Smith hat meine Aufmerksamkeit auf LWG 2234 gelenkt, die von Daniel Krügler eingereicht wurde und versucht zu erstellen die Zusicherung, auf die ich oben Bezug nehme.
Das Auslösen einer Ausnahme kann nützlich sein, da der Compiler den Laufzeitteil ignoriert, wenn er zur Kompilierungszeit weiß, dass die Ausnahme nicht ausgelöst wird.
%Vor% Eine Verfeinerung von Daniel Freys Antwort ist die Verwendung von noexcept
in der Funktion constexpr
, um den Laufzeitfehler in einen Aufruf von std::terminate
zu verwandeln. Assertionsfehler sind nicht wiederherstellbar. Sie sollten den Prozess sofort stoppen. Sie zu Ausnahmen zu machen, ist eine sehr schlechte Idee.
Der Laufzeitfehler für mich sieht so aus:
%Vor%Ich hoffe, das hilft.