contract_assert
语句 (自 C++26 起)
来自 cppreference.cn
contract_assert 语句是一种合约断言,可以出现在函数或 lambda 函数体中,以验证内部条件。它确保条件在执行期间成立,如果条件求值为 false 或求值通过异常退出,则在调试版本中触发违规(例如,终止),并且为了性能,可以在发布版本中忽略它。
目录 |
[编辑] 语法
contract_assert attr(可选) ( predicate ) ; |
|||||||||
attr | - | 任意数量的 属性 |
predicate | - | 应求值为 true 的布尔表达式 |
[编辑] 关键字
[编辑] 注解
特性测试宏 | 值 | 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 (属性说明符) |