c++11 lamda式構文整理

6818 ワード

C++11 lamda式文法整理
基本構文
[キャプチャリスト](パラメータリスト)オプション->戻り値タイプ{関数実装;}
取得リスト
[]変数をキャプチャしないで、f 1,f 2[val]を参照してf 3[=]を参照してすべての変数をキャプチャし、f 4[&]を参照してすべての変数をキャプチャし、f 6[this]を参照してthisポインタを取得し、関数内でクラスのメンバー変数を使用して変更することができ、Test[=,&val]を参照して値によってval以外のすべての変数をキャプチャし、参照によってvalをキャプチャし、f 5[&,val]を参照によってval以外のすべての変数をキャプチャし、値によってvalを取得し、f 7を参照してください.なぜか、「val,&」と書くと、vs 2015は間違っています.
パラメータリスト
パラメータを入力する必要がなければ省略できます
オプション
なし:値によって取得された変数は関数体内では修正できません.f 3 mutableを参照してください.値によって取得された変数は関数体内で修正できます.f 8を参照してください.
戻り値のタイプ
戻り値が明らかであれば、コンパイラは自動的に導出することができ、戻り値を式で示す必要はありません.
コードの説明
#include 
using namespace std;

class Test
{
    int val;
public:
    void OutPut()
    {
        val = 5;
        cout << "val=" << val << endl; //   val=5
        auto f = [this] {
            ++val;
        };
        f();
        cout << "after f()" << endl;
        cout << "val=" << val << endl; //   val=6
    }
};

int main()
{
    int a = 1;
    int b = 2;
    int c = 3;
    auto f1 = []() ->int {return 1; };
    cout << "f1():" << f1() << endl; //   f1():1
    auto f2 = [] {return 2; };
    cout << "f2():" << f2() << endl; //   f2():2
    auto f3 = [a] {
        cout << "f3:" << endl;
        cout << "a=" << a << endl;
        //++a;  error C3491: “a”:        lambda          
    };
    //  :
    //f3:
    //a=1
    f3();

    auto f4 = [=] {
        cout << "f4:" << endl;
        cout << "a=" << a << endl;
        cout << "b=" << b << endl;
        cout << "c=" << c << endl;
        //++a;  error C3491: “a”:        lambda          
    };
    //  :
    //f4:
    //a=1
    //b=2
    //c=3
    f4();

    auto f5 = [=, &a] {
        cout << "f5:" << endl;
        ++a;
        cout << "a=" << a << endl;
        cout << "b=" << b << endl;
        cout << "c=" << c << endl;

    };
    //  :
    //f5:
    //a=2
    //b=2
    //c=3
    f5();

    auto f6 = [&] {
        ++a;
        ++b;
        ++c;
    };
    f6();
    cout << "a=" << a << endl; //   a=3
    cout << "b=" << b << endl; //   b=3
    cout << "c=" << c << endl; //   c=4

    auto f7 = [&,a]{
        //++a; error C3491: “a”:        lambda          
        ++b;
        ++c;
    };
    f7();
    cout << "a=" << a << endl; //    a=3
    cout << "b=" << b << endl; //    b=4
    cout << "c=" << c << endl; //    c=5

    auto f8 = [a]()mutable {
        ++a;
        cout << "a=" << a << endl; //    a=4
    };
    f8();
    cout << "a=" << a << endl; //    a=3
    Test t;
    t.OutPut();
    return 0;
}