Function contract specifiers (since C++26)
Function contract specifiers (preconditions spelled with pre and postconditions spelled with post) are specifiers that may be applied to the declarator of a function or of a lambda expression to introduce a function contract assertion of the respective kind to the corresponding function.
They ensure the specified 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[hide] |
[edit] Precondition
A precondition (pre) is a predicate that the caller must ensure holds before invoking a function or lambda, checked in debug builds to validate inputs or state.
[edit] Postcondition
A postcondition (post) is a predicate that the callee must ensure holds after a function or lambda completes, verified in debug builds to confirm output or state.
[edit] Syntax
pre attr (optional) ( expr )
|
(1) | ||||||||
post attr (optional) ( result-name (optional) predicate )
|
(2) | ||||||||
attr | - | any number of attributes |
result-name | - | identifier :
|
identifier | - | name of a result binding of the associated function |
predicate | - | boolean expression that should evaluate to true |
[edit] Keywords
[edit] Example
- The precondition of function
normalize
requires caller to pass normalizablevector
. - The postcondition ensures that the function
normalize
returns a normalized vector.
template <std::floating_point T> constexpr auto is_normalizable(const std::array<T, 3>& vector) noexcept { const auto& [x, y, z] {vector}; const auto norm{std::hypot(x, y, z)}; return std::isfinite(norm) && norm > T {0}; } template <std::floating_point T> constexpr auto is_normalized(const std::array<T, 3>& vector) noexcept { const auto& [x, y, z] {vector}; const auto norm{std::hypot(x, y, z)}; constexpr auto tolerance{010 * std::numeric_limits<T>::epsilon()}; if (!is_normalizable(norm)) [[unlikely]] return false; return std::abs(norm - T{1}) <= tolerance; } template <std::floating_point T> constexpr auto normalize(std::array<T, 3> vector) noexcept -> std::array<T, 3> pre(is_normalizable(vector)) post(vector: is_normalized(vector));
[edit] References
- C++26 standard (ISO/IEC 14882:2026):
- 9.(3+c ) Function contract specifiers [dcl.contract]
[edit] See also
Contract assertions (C++26) | specifies properties that must hold at certain points during execution |
contract_assert statement (C++26)
|
verifies an internal condition during execution |