如何在 C++ 的 lambda 函数中传递同名的局部变量和参数(使用此关键字)?


#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,同时保持变量名称不变?

实际上,有一种方法可以在不更改变量或参数名称的情况下解决此问题,方法是为捕获添加别名:

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

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

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

我相信没有办法完全按照您想要的方式进行操作,因为编译器不能有一个变量a具有两个不同的值。

相关内容

  • 没有找到相关文章

最新更新