HeadlinesBriefing HeadlinesBriefing.com

C++26 契约入门:前置与后置条件

Hacker News •
×

在关于标准库加固的文章中,我们看到许多库要求都以“契约”的形式表达。本文探讨 C++26 中的契约,以及如何将其应用于我们自己的代码。

讨论从一个简单的例子开始:一个函数根据给定索引从 std::vector 中返回一个值。传统上,索引有效这一要求是通过在函数体内使用 assert 来强制执行的。这种方法存在缺点。该要求位于实现中,因此只阅读声明的人看到的是一个 vector 和一个索引,却看不到两者之间的关系。断言还仅受 NDEBUG 控制,定义该宏时会完全移除检查。

通过 P2900 引入的 C++26 契约,将该要求移入函数签名,放在参数列表之后的 pre(...) 子句中。该前置条件说明函数入口处预期成立的条件。同样的要求也可以出现在声明上,使任何阅读 API 的人都能看到。契约提供多种评估语义,包括忽略检查、报告违规后继续执行,或终止程序,具体可用的选项及其选择方式由编译器实现决定。

契约还区分调用者必须提供的内容与函数承诺返回的内容。使用 post 引入的后置条件表达这些承诺,无需在每个 return 语句之前进行手动检查。因此,即使禁用了运行时检查,契约仍有助于记录 API。

文章最后给出一个完整的前置条件示例,并涵盖后置条件、契约在声明与定义上的放置位置、编译器选项,以及可能让开发者意外的细节等更多主题。

来源: Hacker News · 由HeadlinesBriefing整理摘要