contract_assert
statement
(since C++26)
Операция contract_assert представляет собой контрактное утверждение, которое может присутствовать в теле функции или лямбда-выражения для проверки внутреннего условия. Оно гарантирует, что условие выполняется во время исполнения, вызывая нарушение (например, завершение программы) в отладочных сборках, если условие принимает значение false или вычисление завершается через исключение, и может игнорироваться в релизных сборках для повышения производительности.
Содержание |
Синтаксис
contract_assert
attr
(необязательно)
(
predicate
)
;
|
|||||||||
| attr | - | любое количество attributes |
| 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)}; // отладочная проверка безопасности нормализации 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++ (ex PGI)*
|
Nvidia nvcc
|
Cray
|
|---|---|---|---|---|---|---|---|---|---|---|
| Контракты ( FTM ) * | P2900R14 |
Ссылки
- Стандарт C++26 (ISO/IEC 14882:2026):
-
- 8.(7+ c ) Утверждающая инструкция [stmt.contract.assert]
Смотрите также
|
прерывает выполнение программы, если заданное пользователем условие не является
true
. Может быть отключено для релизных сборок.
(функциональный макрос) |
|
| Контрактные утверждения (C++26) | определяет свойства, которые должны выполняться в определенных точках во время выполнения |
static_assert
declaration
(C++11)
|
выполняет проверку утверждений во время компиляции |
| спецификаторы контрактов функций (C++26) | определяет предусловия ( pre ) и постусловия ( post ) |
[[
assume
(
expression
)]]
(C++23)
|
указывает, что
выражение
всегда будет вычисляться в
true
в заданной точке
(спецификатор атрибута) |