CppCoreGuidelines R.2 在接口中,只用原始指针表示独立的对象
08 February 2023
“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 是一个可选的值,那么引用就不合适了。
强化
- 标记在指针上使用了指针运算符的情况(包括
++
)。不过在老代码上,会产生很多误报。 - 标记数组名作为单独指针传递的情况