CppCoreGuidelines ES.27 栈中数组用 std::array 或 stack_array
04 April 2023
“Use std::array
or stack_array
for arrays on the stack”
理由
可读性更好,不会隐式地类型转换成指针。不会和不标准的内置数组类型扩展搞混淆了。
坏例子
const int n = 7; int m = 9; void f() { int a1[n]; int a2[m]; // error: not ISO C++ // ... }
注意
a1
的定义在C++中一直是合法的。但是容易出错,尤其是当数组的范围变量不是本地的时候。另外,这也是常见出错的地方(比如,缓冲区移除、指针腐蚀等)。然而 a2
在 C 中合法,在C++中不合法。容易引起安全性问题。
建议参考以下例子
const int n = 7; int m = 9; void f() { array<int, n> a1; stack_array<int> a2(m); // ... }
强化
标注使用非常量的范围值的数组
标注非局部常量作为范围值的数组