数组中传递给非主函数的基于范围的循环

当我尝试在gcc 4.8.2中编译下面的代码时,出现以下错误:

test.cc: In function 'void foo(int*)': test.cc:15:16: error: no matching function for call to 'begin(int*&)' for (int i : bar) { ^ 

还有一堆来自模板库的更深层次的内容。

 #include <iostream> using namespace std; void foo(int*); int main() { int bar[3] = {1,2,3}; for (int i : bar) { cout << i << endl; } foo(bar); } void foo(int* bar) { for (int i : bar) { cout << i << endl; } } 

如果我重新定义foo使用索引for循环,则代码编译并按预期运行。 另外,如果我将基于范围的输出循环移到main ,我也会得到预期的行为。

如何将数组bar传递给foo ,使其能够执行基于范围的for循环?

随着arrays衰减成一个指针,你正在失去一个重要的信息:它的大小。

有了数组引用,基于范围的循环就可以工作:

 void foo(int (&bar)[3]); int main() { int bar[3] = {1,2,3}; for (int i : bar) { cout << i << endl; } foo(bar); } void foo(int (&bar)[3]) { for (int i : bar) { cout << i << endl; } } 

或者以通用的方式(即,没有指定函数签名中的数组大小),

 template <std::size_t array_size> void foo(int (&bar)[array_size]) { for (int i : bar) { cout << i << endl; } } 

试试看

对于一个固定大小的数组,你可以

  • 通过引用传递一个原始数组。

  • 通过引用传递一个std::array

  • 通过引用传递一个std::vector

自然select(对于一个固定大小的数组)是std::array ,即

 #include <iostream> #include <array> using namespace std; void foo(array<int, 3> const& bar) { for (int i : bar) { cout << i << endl; } } int main() { array<int,3> const bar = {1,2,3}; for (int i : bar) { cout << i << endl; } foo(bar); }