c ++中基于范围的for循环

joh*_*ers 5 c++ arrays templates template-argument-deduction for-range

似乎C++ 11中可用的"for each"语法允许在不知道数组的实际大小(元素数量)的情况下进行数组迭代.我认为,因为它是新标准的一部分,所以这是非常安全的,即使对于C阵列也是如此.通常,在操作C数组之前,您还必须单独知道C数组的大小,但我希望任何有这种新C++技术经验的人都可以验证它是否与您期望的完全相同:

extern float bunch[100];

for (float &f : bunch) {
  f += someNumber;
}
Run Code Online (Sandbox Code Playgroud)

对于这种技术,我应该知道哪些非明显的副作用或缺点?它在我看到的代码中没有显示太多,可能是因为大多数代码都是在标准之前编写的.想要确保它的罕见用法不是因为其他一些不为人知的原因.

jua*_*nza 4

这种用法并没有什么奇怪或不安全的地方。数组的大小在编译时已知,因此可以在循环中使用。这是一个模板函数的示例,可让您找出数组的长度:

template< class T, std::size_t N >
std::size_t length( const T (&)[N] )
{
  return N;
}

Foo f[5];
std::cout << length(f) << "\n";
Run Code Online (Sandbox Code Playgroud)

这应该清楚地表明您不能在动态大小的 C 样式数组上使用此技术或基于范围的循环。

当然,如果你有基于范围的循环,那么你也应该有std::array(如果没有,你可能可以从 tistd::tr1或 boost 获取),这样你就可以完全避免 C 风格的数组:

extern std::array<float, 100> bunch;

for (auto &f : bunch) {
  f += someNumber;
}
Run Code Online (Sandbox Code Playgroud)