c++11学习之lambda表达式

最近在项目开发过程中用到了c++11的lambda表达式,也是边学习边使用,下面总结下我对lambda表达式的认识。

lambda表示实际是一个函数,它的语法如下:

[capture](parameters) ->returnType {statements} 或者

[capture](parameters) mutable ->returnType {statements}

1.[capture]捕获列表,其中参数列表可以有多种形式,以逗号做为分割,捕获列表捕获上下文的变量以供lambda表达式使用

[]表示不捕获任何变量(包括this指针);

[=]以值传递方式捕获上下文的所有变量(包括this指针);

[&]以引用传递方式捕获上下文的所有变量;

[=,&a,&b]以引用传递方式捕获变量a和变量b,以值传递方式捕获上下文中的其它变量;

[&,a,b]以值传递方式捕获变量a和变量b,以引用传递方式捕获上下文的其它变量;

[this]表示值传递方式捕获this指针;

另外需要注意不能出现一下两种情况,否则程序会报错:

[&,&a]以引用捕获方式捕获了所有变量,但是重复捕获了变量a,程序会报错;

[=,&b]以值传递捕获方式捕获了所有变量,但是重复捕获了变量b,程序依然会报错;

2.(parameters):参数列表,跟普通函数的参数列表一样,如果不需要传递任何参数,则可以为空(当然可以连同"()"一起省略)

3.mutable:mutable修饰符,默认情况下,lambda表达式是一个const函数,可以通过mutable修饰符来取消其const属性

4.->returnType:返回类型,在函数返回值明确的情况下,可以省略该部分,让编译器自动进行类型推导;在不需要函数返回值的情况下,可以将"->"一同省略

5.{statements}:函数体,跟普通函数的函数体一样,不过它不仅可以可以使用参数列表的参数,还可以使用捕获的所有变量

下面来看一个lambda表达式的例子:

#include <iostream>

using namespace std;

int main() { int variable = 1; //auto const_variable_lambda = [=](){variable= 2;};//只读,编译时程序会报错 //cout << by_variable_lambda() << endl;

auto mutable_variable_lambda = [=]() mutable{variable = 3; return variable;}; cout << mutable_variable_lambda() << endl;

auto const_reference_lambda = [&]() {variable = 7; return variable;}; cout << const_reference_lambda() << endl;

auto mutable_reference_lambda = [&]() mutable {variable = 8; return variable;}; cout << mutable_reference_lambda() << endl;

return 0; }

另外,使用lambda表达式的一个原因,是创建了一个希望接受lambda函数的函数,其中std::function是传递lambda函数的最好方式,下面是项目中使用lambda表达式的部分代码

#include <functional> #include <algorithm>

using Task = std::function<void(void) >;

bool CHTTPClient::AsynSendHttpData(const Http_ClientMessagePtr & httpMsgPtr) { if (m_bHasClosed) { return TRUE; } m_HttpDataAsyncSendQueue.Append(httpMsgPtr); if(m_HttpDataAsyncSendQueue.GetSize() > 500) { PTRACE(3, "Bfcp data asynchronous send queue cache too much bfcp data!"); } Task t = std::bind(&CHTTPClient::SendHttpDataTask, this); m_pEndPoint->AddUvTask(t); return TRUE; }

经验分享 程序员 微信小程序 职场和发展