如何在 C++ 的 lambda 函数中传递同名的局部变量和参数(使用 this 关键字)?
how to pass local variable and argument of same name (using this keyword )inside lambda functions in c++?
#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 ; };
与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
传递给 lambda 对象(即转移所有权!) std::move()
.
我相信没有办法完全按照您的意愿去做,因为编译器不能让一个变量 a
具有两个不同的值。
#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 ; };
与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
传递给 lambda 对象(即转移所有权!) std::move()
.
我相信没有办法完全按照您的意愿去做,因为编译器不能让一个变量 a
具有两个不同的值。