08 February 2023

C++ 核心指南目录

“In interfaces, use raw pointers to denote individual objects (only)”

理由

最好用容器类型表示数组,比如 vector(有所有权的)或 span(无所有权的)。因为容器和 view 带有可以进行范围检查的信息。

坏例子

void f(int* p, int n)   // n is the number of elements in p[]
{
    // ...
    p[2] = 7;   // bad: subscript raw pointer
    // ...
}

编译器无法解析代码注释,没有其他信息,无法知道 p 执行的数组元素的数量是 n。应该使用 span。

例子

void g(int* p, int fmt)   // print *p using format #fmt
{
    // ... uses *p and p[0] only ...
}

例外

C 风格字符串以 NULL 结尾,所以可以以单独指针的方式传参。避免使用 char* ,用 zstring 来表达你需要用到空字符结尾的字符串。

注意

目前很多指向单一元素的指针都可以用引用替代。不过,如果 nullptr 是一个可选的值,那么引用就不合适了。

强化

  • 标记在指针上使用了指针运算符的情况(包括 ++ )。不过在老代码上,会产生很多误报。
  • 标记数组名作为单独指针传递的情况