contract_assert statement (since C++26)
From cppreference.com
C++
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 | ||||||||||||||||
| ||||||||||||||||
| 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 | ||||||||||||||||
Statements
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 |
[edit] Syntax
contract_assert attr (optional) ( predicate ) ;
|
|||||||||
| attr | - | any number of attributes |
| predicate | - | boolean expression that should evaluate to true |
[edit] Keywords
[edit] Notes
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_contracts |
202502L |
(C++26) | Contracts |
[edit] 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; }
[edit] 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 |
[edit] References
- C++26 standard (ISO/IEC 14882:2026):
- 8.(7+c ) Assertion statement [stmt.contract.assert]
[edit] See also
| aborts the program if the user-specified condition is not true. May be disabled for release builds. (function macro) [edit] | |
| Contract assertions (C++26) | specifies properties that must hold at certain points during execution[edit] |
static_assert declaration (C++11)
|
performs compile-time assertion checking[edit] |
| function contract specifiers (C++26) | specifies preconditions (pre) and postconditions (post)[edit] |
[[assume(expression)]](C++23) |
specifies that the expression will always evaluate to true at a given point (attribute specifier)[edit] |