25 March 2022

C++ 核心指南目录

理由:

  • 避免对空指针进行取值操作,导致错误。
  • 无需对空指针进行多余检查,提升性能。

例如:

int length(const char* p);            // 不清楚 length(nullptr) 是否正确

length(nullptr);                      // OK?

int length(not_null<const char*> p);  // 更好:可以认为 p 非空
int length(const char* p);            // p 可以是空指针

在代码中清晰表明代码的意图,可以让实现者和相关工具提供更明确的诊断信息。比如可以通过静态检测发现某些错误。还可以提升性能,比如减少判断指针指针是否为空的逻辑分支。

注意:

GSL 定义了 not_null

注意:

const char* 这种指向 char 的指针用来表示 C 风格的 \0 结束的字符串,不太直接,容易误解和出错。建议使用 czstring

// we can assume that p cannot be nullptr
// we can assume that p points to a zero-terminated array of characters
int length(not_null<zstring> p);

注意:

这里 length() 只是举个例子,实际代码中应该用标准库里的 std::strlen()

强化:

  • (简单,基础)如果函数会在各种分支中检查传入参数的指针是否为空指针。建议把参数声明为 not_null
  • (复杂)如果函数在各个返回路径都要确保返回的不是空指针,建议把返回类型声明为 not_null