gpt4 book ai didi

c++ - 使用参数 lambda 函数 C++

转载 作者:搜寻专家 更新时间:2023-10-31 00:29:40 25 4
gpt4 key购买 nike

我有这段代码:

    void function1(char c, bool b){

auto get_allowed = [&](int x){
if(b){
.... some code...
}
...some code...
}

get_allowed(0);
...other_code...
}

在这种情况下,我可以在 lambda 函数中使用 b 吗??

我的意思是,将该参数添加到 lambda 函数的签名中是一回事,例如:

    void function1(char c, bool b){

auto get_allowed = [&](int x,bool b){
if(b){
.... some code...
}
...some code...
}

get_allowed(0, false);
...other_code...
}

澄清一下,区别就在这里:

 auto get_allowed = [&](int x){
get_allowed(0);

对比

 auto get_allowed = [&](int x,bool b){
get_allowed(0, false);

其中 b 是函数 function1 的参数。

最佳答案

在您的示例中,两个版本的 lambda 的效果大致相同。但是,捕获的参数与“正常”参数存在显着差异。

以下是 lambda 的创建方式:

[ capture-list ] ( params ) { body }

capture-list 可以让您访问存在于您的 lambda 范围内的变量。有一些不同的捕获模式:

  • [&] 通过reference 捕获周围范围内的所有局部变量(即bc在你的例子中)
  • [&b] 仅通过引用捕获 b,您可以根据需要放置任意数量的命名变量(逗号分隔)
  • [=] 捕获周围范围内的所有局部变量(换句话说:您的 lambda 包含这些变量的拷贝)
  • [b] 仅通过复制捕获 b
  • [b, &c] 你可以混合复制和引用捕获

您应该问问自己:这些捕获的目的是什么?

嗯,它定义了一个闭包,一个上下文每次使用 lambda 时都是一样的。这种在函数之上添加的状态在很多情况下都非常有用。

一个例子:你在集合的每个元素上映射一个 lambda:

std::vector<int> numbers = {1, 2, 3, 4, 5};

int sum = 0;
std::for_each(std::begin(numbers), std::end(numbers),
[&sum](int n){ sum += n; });

在这里,我们使用通过引用捕获的变量来存储(和更新) vector 中所有数字的总和。

花点时间思考一下这个例子,做一些你自己的实验,这就是关于 lambda 的全部知识。 :)

关于c++ - 使用参数 lambda 函数 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40114004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com