命名空间
变体
操作

contract_assert 语句 (自 C++26 起)

来自 cppreference.cn
< cpp‎ | language
 
 
C++ 语言
通用主题
流程控制
条件执行语句
if
迭代语句 (循环)
for
范围 for (C++11)
跳转语句
函数
函数声明
Lambda 函数表达式
inline 说明符
动态异常规范 (在 C++11 中弃用*)
noexcept 说明符 (C++11)
异常
命名空间
类型
说明符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
存储期说明符
初始化
 
 

contract_assert 语句是一种合约断言,可以出现在函数或 lambda 函数体中,以验证内部条件。它确保条件在执行期间成立,如果条件求值为 false 或求值通过异常退出,则在调试版本中触发违规(例如,终止),并且为了性能,可以在发布版本中忽略它。

目录

[编辑] 语法

contract_assert attr(可选) ( predicate ) ;
attr - 任意数量的 属性
predicate - 应求值为 true 的布尔表达式

[编辑] 关键字

contract_assert

[编辑] 注解

特性测试宏 Std 特性
__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 标准 (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)
指定 expression 在给定点将始终求值为 true
(属性说明符)[编辑]