5 分钟内解释的 C++ 合同 - timur.audio

主要观点:提议在 C++语言中添加合同断言(contract assertions),目前处于 C++26 草案标准的措辞审查最后阶段。合同断言类似现有assert宏但更简单灵活强大,如contract_assert可替代assert,有四种评估语义可选(ignore、enforce、observe、quick-enforce),还可通过定义全局函数handle_contract_violation自定义行为,有prepost可用于表示函数的前置和后置条件且可置于函数声明上。
关键信息:

  • 合同断言可在运行时检测错误,默认行为与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)。
阅读 7
0 条评论