基于范围的for-loop on数组传递给非主函数

时间:2014-10-03 16:26:02

标签: c++ gcc c++11 for-loop

当我尝试在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循环?

3 个答案:

答案 0 :(得分:16)

array decaying成为指针时,你丢失了一条重要的信息:它的大小。

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

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;
  }
}

Try it out

答案 1 :(得分:3)

对于固定大小的数组,您可以

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

  • 通过引用传递std::array

  • 通过引用传递std::vector

自然选择(对于固定大小的数组)是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);
}

答案 2 :(得分:1)

使用 C++20 的 std::span,您可以引用数组或运行时大小。

这是您使用 std::span 代替的代码:

#include <iostream>
#include <span>

void foo(std::span<int>);

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

void foo(std::span<int> bar) {
  for (int i : bar) { // now works
    std::cout << i << std::endl;
  }
}