c++lambda式(匿名関数)の使用概要

2622 ワード

#include 
using namespace std;

//[=] () mutable throw() -> int {}

/**
 * lambda expression
 * “Lambda    ”(lambda expression)       ,
 * Lambda         λ    ,        lambda  (lambda abstraction),
 *        ,         。
 * 
 * */

/**
 *       
 * [capture](parameters) mutable ->return-type{statement}
 * 
 * [capture]:    。         Lambda      。   ,[] Lambda   。                    Lambda  。                 Lambda    ;
 * (parameters):    。            。         ,       “()”    ;
 * mutable:mutable   。     ,Lambda      const  ,mutable        。        ,        (      );
 * ->return-type:    。                  。                     ->    。  ,           ,        ,             ;
 * {statement}:   。         ,            ,            。
 *    ,lamda   ,     ,     ,        。           
 * 
 * [var]           var;
 * [=]                  (  this);
 * [&var]          var;
 * [&]                   (  this);
 * [this]            this  。
 *     lambdb                   ,     lambdb              
 *                    
 * */

int main(int argc,char **argv){

    int m = 1;
    auto val_lamda = [=]{return m+1;};  //        m,  lambda        m     ,        m        m
    auto ref_lamda = [&]{return m+1;};  //        m,lambda       m      m.

    cout< function { return [=](int y) { return x + y; }; };

    auto gFunc = [](int x) -> function { return [=](int y) { return x + y; }; };

    auto lFunc = gFunc(4);   //     lambda        x=4   ,x=4       {},  [=]      {}

    auto llFunc = lFunc(5); //lFunc        lambda        ,    function,       lambda       ,5               y,  y    {}

    //        ,4  x=4  ,    ,y=5    ,    。

    std::cout << llFunc << std::endl;  //     9
    
    //      ,       。
    auto hFunc = [](const function &f, int z) { return f(z) + 1; };
    auto aa = hFunc(gFunc(7), 8);

    int a1 = 111, b = 222;
    auto func = [=, &b]() mutable { a1 = 22; b = 333; std::cout << "a:" << a1 << " b:" << b << std::endl; };

    func();
    std::cout << "a1:" << a1 << " b:" << b << std::endl;

    a1 = 333;
    auto func2 = [=, &a1] { a1 = 444; std::cout << "a:" << a1 << " b:" << b << std::endl; };
    func2();

    auto func3 = [](int x) -> function { return [=](int y) { return x + y; }; };

    std::function f_display_42 = [](int x) { cout<