文章从 cassert 出发,把「索引必须有效」这类要求从函数体里的断言搬到函数签名上:C++26 的契约特性(P2900)允许在参数列表后写 pre(...),声明与定义都能带上。与 assert 的差别有三点:要求写在声明里,读 API 的人不必再看实现;检查语义更灵活,可以选择忽略、报告违规后继续或直接终止程序;契约明确区分调用方必须满足的前置条件与函数承诺的后置条件,不必在函数体里手埋检查。文中还提醒了编译器选项与一些容易踩到的细节。
🔑 核心要点
写法是在参数列表后加pre(index < values.size())。
关键收益是要求写在声明里,读 API 的人不必看实现。
相比 assert,契约的检查语义可选:忽略、报告后继续或终止。
契约区分调用方必须提供的前置条件与函数承诺的后置条件。
特性来自提案P2900,Contracts for C++。
💡 金句
We can put pre and post directly in the function declaration. This makes the requirements visible to anyone reading the API, without looking at the implementation.