主要观点:提议在 C++语言中添加合同断言(contract assertions),目前处于 C++26 草案标准的措辞审查最后阶段。合同断言类似现有assert
宏但更简单灵活强大,如contract_assert
可替代assert
,有四种评估语义可选(ignore、enforce、observe、quick-enforce),还可通过定义全局函数handle_contract_violation
自定义行为,有pre
和post
可用于表示函数的前置和后置条件且可置于函数声明上。
关键信息:
- 合同断言可在运行时检测错误,默认行为与
assert
类似,可通过特定标志关闭检查。 - 四种评估语义各有特点,
ignore
不检查断言,enforce
检查失败打印消息并终止,observe
检查失败打印消息继续,quick-enforce
立即终止不打印消息。 - 可自定义合同违规处理行为,通过定义
handle_contract_violation
函数实现。 pre
在函数调用时检查,post
在函数返回时检查,可用于诊断函数调用和内部的错误,可应用于多种函数类型但某些情况除外。
重要细节:- 提议在 2025 年 2 月的 Hagenberg C++委员会会议上移除了虚拟函数的支持。
- 正式提案P2900虽长但多数技术细节普通用户无需担心,学习曲线比过去标准化的协程、概念等更平滑。
- 该功能已在 Clang 和 GCC 中完全实现,可在 Compiler Explorer 上尝试(Clang 链接:https://godbolt.org/z/qEo1vGhqM,GCC 链接:https://godbolt.org/z/7rPxa7TP6)。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。