contract_assert оператор (с C++26)
Оператор contract_assert — это контрактное утверждение, которое может встречаться в теле функции или лямбда-выражения для проверки внутреннего условия. Он гарантирует выполнение условия во время исполнения: в отладочных сборках при значении false или при завершении вычисления с исключением возникает нарушение (например, программа завершается), а в релизных сборках утверждение может игнорироваться для повышения производительности.
Синтаксис
contract_assert attr (необязательно) ( predicate ) ; |
| attr | — | любое количество атрибутов |
| predicate | — | логическое выражение, которое должно принимать значение true |
Ключевые слова
Примечания
| Макрос проверки поддержки возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_contracts | 202502L | (C++26) | Контракты |
Пример
Оператор contract_assert гарантирует, что норма вектора положительна и является нормальным или субнормальным числом.
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;
}
Статус поддержки
| Возможность C++26 | Статьи |
GCC |
Clang |
MSVC |
Apple Clang |
EDG eccp |
Intel C++ |
Nvidia HPC C++ (ранее PGI)* |
Nvidia nvcc |
Cray |
|---|---|---|---|---|---|---|---|---|---|---|
| Контракты (FTM)* | P2900R14 | 16 |
Литература
- Стандарт C++26 (ISO/IEC 14882:2026):
- 8.(7+c ) Оператор утверждения [stmt.contract.assert]
См. также
прерывает программу, если заданное пользователем условие не true. Может быть отключён в релизных сборках. (макрос функции) |
|
| Контрактные утверждения (C++26) | задают свойства, которые должны выполняться в определённых точках во время исполнения |
Объявление static_assert (C++11) | выполняет проверку утверждения во время компиляции |
| Спецификаторы контрактов функции (C++26) | задают предусловия (pre) и постусловия (post) |
[[assume(expression)]](C++23) | задаёт, что выражение всегда будет принимать значение true в указанной точке(спецификатор атрибута) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/contract_assert