17 June 2022

C++ 核心指南目录

F.25: Use a zstring or a not_null<zstring> to designate a C-style string

理由

C 风格字符串很普遍。一般约定为以空字符结尾的字符串数组。我们必须区分 C 风格字符串、指向单个字符的指针还是指向字符串数组的指针。

如果不需要 null 结尾,可以用 string_view

例子

考虑以下函数

int length(const char* p);

其他函数调用length(s)的时候,是否需要先检查 s 非空?还是在length()的函数的代码实现里会去检查确保参数非空?

// the implementor of length() must assume that p == nullptr is possible
int length(zstring p);

// it is the caller's job to make sure p != nullptr
int length(not_null<zstring> p);

以上代码,前一个声明要求代码实现能够接受 p 是空指针的情况。第二个声明,则要求函数的调用方确保传进来的参数不能是空指针。

注意

zstring 不带所有权信息