c++ - 在 C++ Lambda 表达式中,为什么人们更喜欢按值捕获而不是作为参数传递?

标签 c++ c++11 lambda

<分区>

假设我会使用 Lamdba 函数来定义函数内的函数以更好地构建代码,在什么情况下有人可能更喜欢第二个选项而不是第一个选项,因为后者显然不太可重用,因为不能传递不同的参数?

int main() {
    int foo = 1;
    int bar = 4;

    //Passing as Parameters
    auto add = [](auto a, auto b) {
        return a + b;
    };
    std::cout << "Add: " << add(foo, bar) << std::endl;

    //Capturing by value
    auto multiply = [=]() {
        return foo * bar;
    };
    std::cout << "Multiply: " << multiply() << std::endl;

    return 0;
}

最佳答案

按值捕获将值直接存储在 lambda 中。这些值可在该 lambda 的所有调用中访问。

如果您的 lambda 接受参数,那么每次都必须提供值。

这允许您将 lambda 传递给不允许传递参数的事物,或者传递不同数量的参数。例如,您可以将带有捕获变量的 lambda 传递给 std::for_each,并让 lambda 对捕获的值提供的元素进行操作:

std::vector<int> vi={1,2,3,4,452,99};

auto x=56;

std::for_each(vi.begin(),vi.end(),[=](int i){
  std::cout<<x+i<<std::endl;
});

关于c++ - 在 C++ Lambda 表达式中,为什么人们更喜欢按值捕获而不是作为参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59177078/

相关文章:

c++ - 如何只获得给定的捕获组 <regex> C++

c++ - 当显式模板实例化定义先于显式声明时,GCC 和 clang 不同意

c - 模拟 GCC 语句表达式

java - Lambda 表达式没有有效的 final 变量

c++ - 在 C++ 状态机中实现事件条件

c++ - 成员函数模板,其参数数量取决于一个完整的模板参数

C++:从重载函数到 std::function 的转换

C++ iStream、If-Else 和 vector

c++ - 检查使用 SDL2 播放的音乐

c++ - 将 steady_clock::time_point 转换为 time_t