C++11 Lambda表达式

来源:互联网 发布:大数据时代 txt 编辑:程序博客网 时间:2024/06/08 11:41

        Qt之后就一直没打算写什么东西了,一是我太懒,二是确实比较忙。最近在整理代码的时候发现原来有好多东西都开始遗忘了,所以呢还是该写写,没事儿的时候还可以复习复习。

        今早抽了点空看了点node.js,附录有个JavaScript的Closure,想起C++11的Lambda表达式,捣腾了点时间,发现lambda的mutable限定都不知道,哎!好,记下来!


Lambda语法:

        [capture-list] (parameters) specification-list ->return-type { body }


capture-list:

        []              // 不捕获

        [&]           // 以引用方式在Lambda表达式内捕获外部变量

        [=]          // 以传值方式(...)

        [x, &y]      // x传值,y引用

        [&, x]        // x传值,其他的引用

        [=, y]        // y引用,其他的传值


return type:

        可选返回类型声明,若省略,返回类型自动推导


specification-list:

        可以是:

                mutable      让传值的变量在lambda内部可以改变,当然,这不会影响外部变量

                throw           c++11之后不推荐了,出于性能和实用性的考虑

                noexcept    上面的代替

        此列表可省(含->),若指定,则参数列表不能省


parameters:

        你懂的,可省(连同括号),代表不接受参数


一个闭包示例:

#include <iostream>int main (void){auto genClosure = [] {int cnt = 0;return [=] (void) mutable { return ++cnt; };};auto counter1 = genClosure();auto counter2 = genClosure();std::cout << counter1() << std::endl; // 1std::cout << counter1() << std::endl; // 2std::cout << counter2() << std::endl; // 1std::cout << counter1() << std::endl; // 3std::cout << counter2() << std::endl; // 2std::cout << counter2() << std::endl; // 3}




原创粉丝点击