C++ 将数组传递给lambda函数

C++ 将数组传递给lambda函数,c++,lambda,C++,Lambda,我目前正在学习lambda函数是如何工作的,因此我尝试将数组传递给lambda函数,并在那里将其打印出来。我的问题是,我不明白如何将数组传递到函数中。问题的根源似乎在于将数组传递给lambda函数时数组的转换。这是函数的当前状态: auto print_array = [](int &array, int i) -> int { //print out array return 0; }(&actual_array, actual_i); void

我目前正在学习lambda函数是如何工作的,因此我尝试将数组传递给lambda函数,并在那里将其打印出来。我的问题是,我不明白如何将数组传递到函数中。问题的根源似乎在于将数组传递给lambda函数时数组的转换。这是函数的当前状态:

auto print_array = [](int &array, int i) -> int {

    //print out array

    return 0;

}(&actual_array, actual_i);
void foo(int (&array)[20]);

非常感谢您的帮助

数组不能是函数参数

此外,
int
引用不能绑定到
int
数组。整数引用也不能用作数组

但是,可以使用下标运算符访问指针,访问方式与访问数组的方式大致相同。数组的名称实际上隐式转换为指向第一个元素的指针。这种转换称为衰减:

int array[n];
int* ptr_to_first_element = array;
assert(ptr_to_first_element[i] == array[i]);
因此,可以使用整数指针作为函数参数,并将指针传递给数组的第一个元素:

void foo(int *array, std::size_t size);
// ...
int array[n];
foo(array, n);
以上所有内容也适用于lambdas。所以你可以写:

auto print_array = [](int *array, int i) -> int {
    //                    ^ notice this

    //print out array using the pointer

    return 0;

}(&actual_array, actual_i);

但是,您可以将对特定大小数组的引用作为函数的参数:

auto print_array = [](int &array, int i) -> int {

    //print out array

    return 0;

}(&actual_array, actual_i);
void foo(int (&array)[20]);
这是一个位限制,因为引用只能绑定到一个特定大小的数组。模板使为任意大小的数组生成此类函数变得简单:

template<std::size_t size>
void foo(int (&array)[size]);
在这种情况下,
array
参数的类型将被推断为
int(&)[10]


另外,“打印”数组听起来像是不需要修改数组的东西。考虑这一点,如果可能的话,使用<代码> const <代码>指针指向第一个元素或<代码> const < /Cord>引用作为参数。< /P>
请注意,
std::array
包装器是一个类,而不是一个数组。因此,
std::wrapper
不会隐式衰减到指针,如果需要,可以将
std::array
用作函数参数。

声明一个以数组(和长度)为参数的lambda变量

using namespace std;

auto print_array = [](const int *items, int length) {
    for (int i = 0; i < length; i++)
    {
        cout << items[i] << endl;
    }
};

不能按值传递数组,传递指针的语法也完全错误

但实际上,向数组传递指针或引用很容易。使用泛型lambda,您可以忽略维度是类型的一部分这一事实,只需编写:

#include <iostream>

int main()
{
    int actual_array[5] = {7,8,9,2,1};
    const int actual_i = 3;

    auto print_array = [](auto& ar, int i) {
        std::cout << ar[i] << '\n';
    };

    print_array(actual_array, actual_i);
}

这些都不是lambdas特有的。任何函数都是一样的。

什么是
实际数组
?展示你的。
int&array
是对整数的引用,而不是任何类似于数组的东西。“数组不能是函数参数。”通过引用它可以,这实际上是我在这里推荐的。设置参数为
auto&
,就可以了。如果要通过引用传递它而不使用
auto
,语法如下:
auto print\u array=[](int(&array)[SIZE],int i)->int{…}
。请注意,在这种情况下,
大小必须在编译时已知。
#include <iostream>

int main()
{
    int actual_array[5] = {7,8,9,2,1};
    const int actual_i = 3;

    auto print_array = [](const int* ar, int i) {
        std::cout << ar[i] << '\n';
    };

    print_array(&actual_array[0], actual_i);
}