Namensräume
Varianten
Aktionen

contract_assert Anweisung (seit C++26)

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 

Eine contract_assert Anweisung ist eine Vertragsassertion, die im Körper einer Funktion oder Lambda-Ausdrucks erscheinen kann, um eine interne Bedingung zu überprüfen. Sie stellt sicher, dass die Bedingung während der Ausführung erfüllt ist. Bei Nichteinhaltung wird in Debug-Builds eine Verletzung ausgelöst (z. B. Abbruch), wenn die Bedingung zu false ausgewertet wird oder die Auswertung über eine Ausnahme verlassen wird. In Release-Builds kann sie zur Leistungssteigerung ignoriert werden.

Inhalt

[bearbeiten] Syntax

contract_assert attr (optional) ( prädikat ) ;
attr - beliebige Anzahl von Attributen
predicate - boolscher Ausdruck, der zu true ausgewertet werden sollte

[bearbeiten] Schlüsselwörter

contract_assert

[bearbeiten] Hinweise

Feature-Testmakro Wert Std Feature
__cpp_contracts 202502L (C++26) Verträge

[bearbeiten] Beispiel

Die contract_assert stellt sicher, dass die Norm eines Vektors positiv 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 check for normalization safety
    contract_assert(std::isfinite(norm) && norm > T(0));
 
    x /= norm, y /= norm, z /= norm;
 
    return vector;
}

[bearbeiten] Referenzen

  • C++26 Standard (ISO/IEC 14882:2026)
  • 8.(7+c ) Assertion-Anweisung [stmt.contract.assert]

[bearbeiten] Siehe auch

bricht das Programm ab, wenn die vom Benutzer angegebene Bedingung nicht true ist. Kann für Release-Builds deaktiviert werden.
(Funktionsmakro) [bearbeiten]
Vertragsassertionen (C++26) spezifiziert Eigenschaften, die zu bestimmten Zeitpunkten während der Ausführung gelten müssen[bearbeiten]
static_assert Deklaration (C++11) führt Assertionsprüfungen zur Kompilierzeit durch[bearbeiten]
Funktionsvertragspezifizierer (C++26) spezifiziert Vorbedingungen (pre) und Nachbedingungen (post)[bearbeiten]
[[assume(ausdruck)]]
(C++23)
spezifiziert, dass der ausdruck an einer gegebenen Stelle immer zu true ausgewertet wird
(Attribut-Spezifizierer)[bearbeiten]