Roh*_*iya 1 c++ lambda functional-programming inline-functions c++11
#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;
}
Run Code Online (Sandbox Code Playgroud)
我原本期望10 + 50 + 100 = 160,但是输出是10 + 10 + 100 =120。我可以做些改变以获得160,同时保持变量名称不变吗?
ypn*_*nos 10
实际上,可以通过别名捕获来解决此问题而无需更改变量或参数名称:
std::function<int(int)> functionPointer = [b=a](int a)-> int{ return a + b + 100 ; };
Run Code Online (Sandbox Code Playgroud)
如此处所述,由于C ++ 14 lambda捕获是通用的,其中包括重命名lambda对象的变量。尽管捕获[a]会将局部变量a从外部范围复制到lambda对象变量a,但我们也可以使用语法来命名该lambda对象变量[b=a],因此lambda的副本称为b。我们还可以使用表达式(例如[a=5*a]或)定义lambda对象变量[b=5*a],这有时是将struct的成员或访问器方法的结果传递给lambda的一种巧妙方法。
它允许做以前不可能做的事情,即用将a传递unique_ptr给lambda对象(即转移所有权!)std::move()。