10

当我做这样的事情时:

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

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

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

4

3 回答 3

12

这只是语言需要工作的东西,编译器必须实现。显然是的完整类型my_arrayint[5]即大小是类型的一部分),因此这些信息很容易获得。

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

于 2012-11-13T20:28:47.107 回答
6

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

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

这是一个示例大小函数:

template<typename T, size_t N>
size_t array_size(T (& const)[N])
{
    return N;
}
于 2012-11-13T20:31:03.857 回答
5

不,它不是对象的一部分。但它是类型的一部分。这就是5数组声明中的内容。但是,这不起作用:

void f(int arr[5]) {
    for(int& x: arr) {
        // whatever
    }
}

因为这里的数组名衰减为指向其第一个元素的指针,即参数声明相当于int *arr没有大小信息。

于 2012-11-13T20:30:43.130 回答