主要的好处是 std::array 在 C++ 中是 first-class object,这意味着您可以用它做所有其他“普通”C++ 对象可以做的事情。
另一方面,传统的 C 数组不是一流的对象,这意味着很多事情都行不通:
#include <array>
// Works!
std::array<int, 5> ReturnAStdArrayOfSixes()
{
std::array<int, 5> ret;
ret.fill(6);
return ret;
}
// Doesn't compile, sorry
int[5] ReturnACArrayOfSixes()
{
int ret[5];
for (int i=0; i<5; i++) ret[i] = 6;
return ret;
}
int main(int, char **)
{
std::array<int, 5> stdArray1;
std::array<int, 5> stdArray2;
int cArray1[5];
int cArray2[5];
stdArray1 = stdArray2; // works
cArray1 = cArray2; // error: array type 'int [5]' is not assignable
if (stdArray1 < stdArray2) {/* do something */} // compares arrays' contents lexographically
if (cArray1 < cArray2) {/* do something */} // compiles, but compares pointers which probably isn't what you wanted
return 0;
}
至于“传统 C 数组的隐式类型转换”(我认为你的意思是数组类型隐式衰减为指针类型),这是一个有用的机制,但如果你不是,它会咬你期待它,例如:
// This code works as expected
int myArray[5];
cout << "There are " << (sizeof(myArray)/sizeof(int)) << " items in myArray\n";
现在让我们将上面的代码重构为一个不错的函数,以便我们可以重用它:
void PrintArraySize(int myArray[5])
{
std::cout << "There are " << (sizeof(myArray)/sizeof(int)) << " items in myArray\n";
}
int main(int, char **)
{
int myArray[5];
PrintArraySize(myArray);
return 0;
}
...哦,不!现在 PrintArraySize() 有问题,并且打印的数字远小于数组中的项目数! (原因是函数中的myArray已经隐式衰减为指针,所以函数中的sizeof(myArray)求值为sizeof(int *),例如4或8个字节,而不是传入的内容的大小数组)