Namespaces
Variants

contract_assert statement (since C++26)

From cppreference.net
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
constexpr (C++11)
consteval (C++20)
constinit (C++20)
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

Операция contract_assert представляет собой контрактное утверждение, которое может присутствовать в теле функции или лямбда-выражения для проверки внутреннего условия. Оно гарантирует, что условие выполняется во время исполнения, вызывая нарушение (например, завершение программы) в отладочных сборках, если условие принимает значение false или вычисление завершается через исключение, и может игнорироваться в релизных сборках для повышения производительности.

Содержание

Синтаксис

contract_assert attr  (необязательно) ( predicate ) ;
attr - любое количество attributes
predicate - логическое выражение, которое должно вычисляться в true

Ключевые слова

contract_assert

Примечания

Макрос тестирования возможностей Значение Стандарт Возможность
__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 в заданной точке
(спецификатор атрибута)