C ++ 11基于范围的for循环如何知道数组大小?

时间:2012-11-13 20:27:31

标签: c++ for-loop c++11

当我做这样的事情时:

int my_array[5] = {1, 2, 3, 4, 5};
for (int &x : my_array) {
    x *= 2;
}

C ++ 11显然知道我的数组只有5个元素。这些信息是否存储在my_array对象的某个位置?

如果是这样,有没有什么理由让我不能作为开发人员使用(或者是它?!?!?)?如果C ++开发人员总是知道他们正在处理的数组的界限,那么很多世界的问题似乎都会得到解决。

3 个答案:

答案 0 :(得分:12)

这只是语言需要工作的东西,编译器必须实现。显然my_array的完整类型是int[5](即大小是类型的一部分),因此这些信息随时可用。

与流行的看法相反,没有使用免费的std::begin() / std::end()函数,虽然那些天真似乎能够做到这一点(但是有一个涉及ADL的问题会破坏这种方法。)

答案 1 :(得分:6)

可用 - 您可以在标准C ++中的数组上定义beginend。数组的大小以类型编码。

一般方法是使用对数组的引用。

这是一个示例尺寸函数:

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