Alternative für Constexpr-Funktionen

8

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?

%Vor%     
Vittorio Romeo 27.09.2014, 08:14
quelle

3 Antworten

4

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.

    
Howard Hinnant 27.09.2014, 22:06
quelle
8

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%

Live-Beispiel

    
Daniel Frey 27.09.2014 09:09
quelle
5

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.

%Vor%

Der Laufzeitfehler für mich sieht so aus:

%Vor%

Ich hoffe, das hilft.

    
Eric Niebler 27.09.2014 19:57
quelle

Tags und Links