contract_assert
statement
(since C++26)
From cppreference.net
一个 contract_assert 语句是一种合约断言,可出现在函数或lambda函数体中以验证内部条件。它确保该条件在执行期间成立,在调试版本中若条件评估为 false 或评估过程因异常退出则会触发违规(例如终止程序),在发布版本中为性能考虑可忽略该断言。
目录 |
语法
contract_assert
属性
(可选)
(
谓词
)
;
|
|||||||||
| attr | - | 任意数量的 属性 |
| 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
|
|---|---|---|---|---|---|---|---|---|---|---|
| Contracts ( FTM ) * | P2900R14 |
参考文献
- 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)
|
指定在给定点
表达式
始终求值为
true
(属性说明符) |