Namespaces
Variants

contract_assert statement (since C++26)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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

contract_assert

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)