Von dem, was ich verstehe, kann eine constexpr-Funktion sowohl zur Kompilierzeit als auch zur Laufzeit ausgeführt werden, abhängig davon, ob die gesamte Auswertung zur Kompilierzeit durchgeführt werden kann oder nicht.Wie kann ich eine Runtime-Assert in einer Constexpr-Funktion tun?
Sie können diese Funktion jedoch nicht überladen, um eine Laufzeit- und eine Kompilierzeit-Entsprechung zu haben.
Also meine Frage ist, wie kann ich in eine Laufzeit Assert, um sicherzustellen, dass die Ausführung der Laufzeitfunktion gültige Parameter zusammen mit meinem static_assert übergeben?
ich auch habe herausgefunden, dass Sie Assert direkt in einem Listenkontext verwenden können. consxpr bool in_range (int val, int min, int max) {return (assert (min <= max), min <= val && val <= max); } 'Grundsätzlich müssen Sie es so einrichten, dass es niemals zum Aufruf von non-constexpr gelangen kann, wenn es bei einem Fehler in einem consExpr-Kontext verwendet wird. Dies funktioniert, weil assert ein Makro für einen ternären Ausdruck ist, der bei Versagen die zugrunde liegende non-consxpr-Funktion aufruft. – Adrian
@Adrian interessant zu beachten, dass [der Komma-Operator war nur in konstanten Ausdrücken in C++ 11 erlaubt] (http://stackoverflow.com/q/27324573/1708801). –
@Adrian, obwohl das nicht portabel sein wird, da es sich auf das Implementierungsdetail von 'assert' verlässt, das nicht durch den Standard abgedeckt wird. –