数组中传递给非主函数的基于范围的循环
当我尝试在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); }