contract_assert
statement
(since C++26)
From cppreference.net
A contract_assert statement is a contract assertion that may appear in a function or lambda body to verify an internal condition. It ensures the condition holds during execution, triggering a violation (e.g. termination) in debug builds if the condition evaluates to false or the evaluation exits via an exception, and can be ignored in release builds for performance.
Contents |
Syntax
contract_assert
attr
(optional)
(
predicate
)
;
|
|||||||||
| attr | - | any number of attributes |
| predicate | - | boolean expression that should evaluate to true |
Keywords
Notes
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_contracts
|
202502L
|
(C++26) | Contracts |
Example
The contract_assert ensures that vector's norm is positive and either normal or subnormal .
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; }
Support status
|
C++26 feature
|
Paper(s)
|
GCC
|
Clang
|
MSVC
|
Apple Clang
|
EDG eccp
|
Intel C++
|
Nvidia HPC C++ (ex PGI)*
|
Nvidia nvcc
|
Cray
|
|---|---|---|---|---|---|---|---|---|---|---|
| Contracts ( FTM ) * | P2900R14 |
References
- C++26 standard (ISO/IEC 14882:2026):
-
- 8.(7+ c ) Assertion statement [stmt.contract.assert]
See also
|
aborts the program if the user-specified condition is not
true
. May be disabled for release builds.
(function macro) |
|
| Contract assertions (C++26) | specifies properties that must hold at certain points during execution |
static_assert
declaration
(C++11)
|
performs compile-time assertion checking |
| function contract specifiers (C++26) | specifies preconditions ( pre ) and postconditions ( post ) |
[[
assume
(
expression
)]]
(C++23)
|
specifies that the
expression
will always evaluate to
true
at a given point
(attribute specifier) |