contract_assert
statement
(since C++26)
Eine contract_assert -Anweisung ist eine Vertragsassertion, die im Körper einer Funktion oder eines Lambdas erscheinen kann, um eine interne Bedingung zu überprüfen. Sie stellt sicher, dass die Bedingung während der Ausführung erfüllt ist und löst in Debug-Builds eine Verletzung (z.B. Beendigung) aus, wenn die Bedingung zu false ausgewertet wird oder die Auswertung über eine Exception beendet wird, und kann in Release-Builds aus Leistungsgründen ignoriert werden.
Inhaltsverzeichnis |
Syntax
contract_assert
attr
(optional)
(
predicate
)
;
|
|||||||||
| attr | - | beliebige Anzahl von Attributen |
| predicate | - | boolescher Ausdruck, der zu true ausgewertet werden sollte |
Schlüsselwörter
Hinweise
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_contracts
|
202502L
|
(C++26) | Contracts |
Beispiel
Die contract_assert stellt sicher, dass die Vektornorm positiv ist und entweder normal oder subnormal ist.
template <std::floating_point T> constexpr auto normalize(std::array<T, 3> vector) noexcept pre(/* is_normalizable(vector) */) post(/* vector: is_normalized(vector) */) { auto& [x, y, z]{vector}; const auto norm{std::hypot(x, y, z)}; // Debug-Prüfung für Normalisierungssicherheit contract_assert(std::isfinite(norm) && norm > T(0)); x /= norm, y /= norm, z /= norm; return vector; }
Unterstützungsstatus
|
C++26-Funktion
|
Paper(s)
|
GCC
|
Clang
|
MSVC
|
Apple Clang
|
EDG eccp
|
Intel C++
|
Nvidia HPC C++ (ex PGI)*
|
Nvidia nvcc
|
Cray
|
|---|---|---|---|---|---|---|---|---|---|---|
| Contracts ( FTM ) * | P2900R14 |
Referenzen
- C++26-Standard (ISO/IEC 14882:2026):
-
- 8.(7+ c ) Assertion-Anweisung [stmt.contract.assert]
Siehe auch
|
bricht das Programm ab, wenn die benutzerdefinierte Bedingung nicht
true
ist. Kann für Release-Builds deaktiviert werden.
(Funktionsmakro) |
|
| Contract assertions (C++26) | spezifiziert Eigenschaften, die an bestimmten Punkten während der Ausführung gelten müssen |
static_assert
declaration
(C++11)
|
führt Überprüfungen zur Compile-Zeit durch |
| function contract specifiers (C++26) | spezifiziert Vorbedingungen ( pre ) und Nachbedingungen ( post ) |
[[
assume
(
expression
)]]
(C++23)
|
spezifiziert, dass der
Ausdruck
an einem bestimmten Punkt immer zu
true
ausgewertet wird
(Attributspezifizierer) |