21 March 2022

C++ 核心指南目录

I.8: Prefer Ensures() for expressing postconditions

理由

可以明确后置条件,可以通过某些外部工具进行检查确保。

例子

#include <gsl/gsl_assert>
#include <string.h>
const int MAX = 10;
void f()
{
    char buffer[MAX];
    // ...
    memset(buffer, 0, sizeof(buffer));
    Ensures(buffer[0] == 0);
}
int main()
{
    f();
    return 0;
}

注意

有多种方式标明后置条件,包括代码注释、条件判断、assert()。然而,这些方式要么很难和普通代码区分开,要么很难更新,要么很难让工具处理,而且可能语义上是错的。

替代方案

某些函数调用完后必须释放的资源,最好通过 RAII 表达。

注意

理想情况, Ensures 最好是接口的一部分,但是比较难实现。目前我们放在接口定义内。一旦语言支持,核心指南会引入标准的前置条件、后置条件与断言判断。

强化

  • 目前语言层面还不支持,请检查assert()判断是否合理。