【问题标题】:how to pass local variable and argument of same name (using this keyword )inside lambda functions in c++?如何在 C++ 中的 lambda 函数中传递同名的局部变量和参数(使用 this 关键字)?
【发布时间】:2020-02-05 17:00:18
【问题描述】:
#include <iostream>
#include <functional>
int main(){
    int a = 10; 
    std::function<int(int)> functionPointer = [a](int a)-> int{ return a + a + 100 ; };
    int returnValue = functionPointer(50);
    std::cout<<returnValue<<endl;
}

我期望 10+50+100 = 160,但输出是 10+10+100 = 120。我可以做任何更改以获得 160,同时保持变量名不变?

【问题讨论】:

标签: c++ c++11 lambda functional-programming inline-functions


【解决方案1】:

其实有一种方法可以在不改变变量或参数名的情况下解决这个问题,就是给捕获取别名:

std::function<int(int)> functionPointer = [b=a](int a)-> int{ return a + b + 100 ; };

正如explained here,由于 C++14 lambda 捕获是通用的,其中包括重命名 lambda 对象的变量。虽然捕获 [a] 会将局部变量 a 从外部范围复制到 lambda 对象变量 a,但我们也可以使用语法 [b=a] 命名该 lambda 对象变量,因此 lambda 的副本称为 b .我们还可以使用表达式定义 lambda 对象变量,例如[a=5*a][b=5*a],这有时是一种简洁的方式,例如将结构的成员或访问器方法的结果传递给 lambda。

它允许做以前不可能的事情,即将unique_ptr 传递给带有std::move() 的lambda 对象(即转移所有权!)。

【讨论】:

  • 这是此处描述的 C++14 功能:isocpp.org/wiki/faq/cpp14-language#lambda-captures
  • 很好——就问题的意义而言,但比重命名参数更难阅读,我认为这更值得推荐(@RohitBakoliya)...
  • 是的,我认为这是一个学术问题。
【解决方案2】:

我相信没有办法完全按照你的意愿去做,因为编译器不能让一个变量a 具有两个不同的值。

【讨论】:

  • 它不能有一个具有两个不同值的变量,但它可以有多个具有相同名称的变量,存在相当多的例子,实际上,问题作者要求另一个(其中,如前所述,格式不正确)。
猜你喜欢
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 2016-12-12
  • 2014-12-14
  • 2022-09-30
  • 1970-01-01
相关资源
最近更新 更多