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