当我做类似这样的事情:
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]
(即大小是 类型 的一部分),因此此信息readily可用。
与普遍认为的相反,在 play 中没有使用免费的 std::begin()
/std::end()
函数,尽管那些函数表面上似乎能够完成任务(但涉及到 ADL 的问题会破坏此方法)。
它是可用的 - 在标准C++中,您可以定义数组上的begin
和end
。数组的大小已编码在类型中。
一般的方法是使用对数组的引用。
这里是一个示例大小函数:
template<typename T, size_t N>
size_t array_size(T (& const)[N])
{
return N;
}
std::extent
。而且,标准库中已经为数组定义了 std::begin
和 std::end
。 - Kerrek SB5
。 然而,以下代码行不起作用:void f(int arr[5]) {
for(int& x: arr) {
// whatever
}
}
int *arr
,它没有大小信息。int a[5]; a + 1; // decay
相反,我喜欢用术语“adjust”来描述这里发生的情况,因为这是标准使用的词语。void foo(int a[5]); // type 'adjustment': equivalent to void foo(int *a)
。我在说这个单词时喜欢使用讽刺的语气。 - bames53(&arr)[5]
。但是,通常可以通过使用数组大小作为模板参数来使其适用于通用大小的数组:请参见https://dev59.com/218e5IYBdhLWcg3wAWns。 - andybuckley
array_size
иҮӘз”ұеҮҪж•°жЁЎжқҝжқҘдә§з”ҹжүҖйңҖзҡ„еҖјпјҢжҲ–иҖ…дҪҝз”ЁзҺ°жҲҗзҡ„std::extent
гҖӮ - Kerrek SBstd::extent
也是C++11新的东西。这些机制(数组类型作为类型的一部分)并不新鲜,所以一直都可以编写std::extent
。只是直到最近才开始使用它。 - Nicol Bolas