Spec-Zone.ru › C++

contract_assert оператор (с C++26)

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

Синтаксис

contract_assert attr (необязательно) ( predicate ) ;
attr — любое количество атрибутов
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)};

    // 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]

См. также

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API