首页 > 解决方案 > 在 lambda 中捕获 std::array

问题描述

我试图测试一些简单的 C 风格的排序函数。在驱动程序中,我写了这样的东西:

int main()
{
    std::array<int, 8> A = { 1, 0, 4, 5, 7, 2, 9, 3 };
    auto lambda = [&A](const std::function<void(int *A, int n)> &sorting_alg) {
        int n = A.size();
        sorting_alg(A.data(), n);
        std::cout << "=> ";
        print(A.data(), n);
        std::cout << std::endl;
    };

    auto do_bubble_sort = std::bind(lambda, bubble_sort);
    auto do_selection_sort  = std::bind(lambda, selection_sort);
    auto do_insertion_sort  = std::bind(lambda, insertion_sort);

    std::cout << "Bubble Sort :" << std::endl;
    do_bubble_sort();
    std::cout << "Selection Sort :" << std::endl;
    do_selection_sort();
    std::cout << "Insertion Sort :" << std::endl;
    do_insertion_sort();

    return 0;
}

我有绑定代码,我可以将其传递A给副本,但它将我的 lambda 限制为size=8,我想避免这种情况。是否可以在不使用诸如之类的东西的情况下实现这一目标std::vector?一旦我将捕获方法更改A为值捕获,它就不再编译了。我想使用数组的副本来测试所有排序功能。为什么我不能std::array按价值捕获?为什么尺寸推断适用于参考案例?

标签: c++c++11lambda

解决方案


默认情况下operator(),lambdaconst的 。这意味着您不能修改 lambda 的任何成员(它是捕获)。当您通过引用捕获时,这意味着您不能将引用更改为引用其他内容,但是由于您已经不能这样做,因此基本上没有任何意义。当您按值捕获时,它会生成该值const,这意味着您不能再像排序方法所需的那样进行修改(您需要data返回一个非常量指针)。

为了解决这个问题,您可以使用mutable关键字来制作 lambda 的operator()not const。那看起来像

auto lambda = [A](const std::function<void(int *A, int n)> &sorting_alg) mutable {
    int n = A.size();
    sorting_alg(A.data(), n);
    std::cout << "=> ";
    print(A.data(), n);
    std::cout << std::endl;
};

推荐阅读