当我做这样的事情时:
int my_array[5] = {1, 2, 3, 4, 5};
for (int &x : my_array) {
x *= 2;
}
C++11 显然知道我的数组只有 5 个元素。此信息是否存储在 my_array 对象中的某个位置?
如果是这样,有什么好的理由不让我作为开发人员使用它(或者是它?!?!?)?如果 C++ 开发人员总是知道他们正在处理的数组的边界,那么世界上的许多问题似乎都会得到解决。
这只是语言需要工作的东西,编译器必须实现。显然是的完整类型my_array
(int[5]
即大小是类型的一部分),因此这些信息很容易获得。
与流行的看法相反,没有使用 free std::begin()
/std::end()
函数,尽管那些似乎天真地似乎能够做到这一点(但有一个涉及 ADL 的问题会破坏这种方法)。
它是可用的 - 您可以在标准 C++ 中定义begin
和end
在数组上。数组的大小在类型中编码。
一般的方法是使用对数组的引用。
这是一个示例大小函数:
template<typename T, size_t N>
size_t array_size(T (& const)[N])
{
return N;
}
不,它不是对象的一部分。但它是类型的一部分。这就是5
数组声明中的内容。但是,这不起作用:
void f(int arr[5]) {
for(int& x: arr) {
// whatever
}
}
因为这里的数组名衰减为指向其第一个元素的指针,即参数声明相当于int *arr
没有大小信息。