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を参照してください.
戻り値のタイプ
戻り値が明らかであれば、コンパイラは自動的に導出することができ、戻り値を式で示す必要はありません.
コードの説明
基本構文
[キャプチャリスト](パラメータリスト)オプション->戻り値タイプ{関数実装;}
取得リスト
[]変数をキャプチャしないで、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;
}