#include <iostream>using namespace std;void func1(){ cout<<"lambda運算式,值捕獲,類似值傳遞"<<endl; size_t v1=30;//size_t為unsigned int不帶正負號的整數 size_t v2=30; size_t v3=30; auto f=[v1,v2,v3]{return v1+v2+v3;};//lambda運算式中[]裡面放的是要傳遞的參數,可以放多個。 v1=2; cout<<f()<<endl; cout<<endl; //因為這是類似值傳遞,所以v1在改變前就已經給了f,所以不會變。注意隱式捕獲得到的變數不能被改變,只能使用其值不能改變 //可以理解成[const v1]當然你不能這樣寫只是可以這麼認為}void func2(){ cout<<endl; cout<<"lambda運算式,引用捕獲,類似引用傳遞"<<endl; size_t v1=30;//size_t為unsigned int不帶正負號的整數 size_t v2=30; size_t v3=30; auto f=[&v1,v2,&v3]{return v1+v2+(v3++);};//lambda運算式中[]裡面放的是要傳遞的參數,可以放多個。這裡v1,v3為引用,v2為值傳遞 cout<<"引用值沒變前:"<<endl; cout<<"v1="<<v1<<endl <<"v2="<<v2<<endl <<"v3="<<v3<<endl; cout<<f()<<endl; v1=40; cout<<"引用值改變後:"<<endl; cout<<"v1="<<v1<<endl <<"v2="<<v2<<endl <<"v3="<<v3<<endl;//之前調用了一次f所以v3會加1 cout<<f()<<endl; cout<<endl; //因為這是類似引用傳遞,所以v1改變後f返回的值也會對應的改變。而且在f中也引用用v3並且v3進行了自增操作,所以第二次輸出v3時的值是31}void func3(){ cout<<endl; cout<<"lambda運算式,隱式值捕獲"<<endl; size_t v1=30;//size_t為unsigned int不帶正負號的整數 size_t v2=20; size_t v3=10; auto f=[=,&v2] { v2=v1+v3; }; //lambda運算式中[]裡面放的是要傳遞的參數,可以放多個。 //第一個為=,第二個為&v2,表示除了v2是引用傳遞以外,其他從外面來的參數都是值傳遞,而隱式傳遞同時只能用一種。要麼引用要麼值傳遞 //值傳遞只能被使用,不能被改變,如果企圖改變值傳遞的值編譯會報錯 cout<<"沒變前:"<<endl; cout<<"v1="<<v1<<endl <<"v2="<<v2<<endl <<"v3="<<v3<<endl; cout<<"改變後:"<<endl; f(); cout<<"v1="<<v1<<endl <<"v2="<<v2<<endl <<"v3="<<v3<<endl; cout<<endl;}void func4(){ cout<<endl; cout<<"lambda運算式,隱式引用捕獲"<<endl; size_t v1=30;//size_t為unsigned int不帶正負號的整數 size_t v2=20; size_t v3=10; auto f=[&,v2] { v1++; v3=v2; }; //lambda運算式中[]裡面放的是要傳遞的參數,可以放多個。 //第一個為&,第二個為v2,表示除了v2是值傳遞以外,其他從外面來的參數都是引用傳遞,而隱式傳遞同時只能用一種。要麼引用要麼值傳遞 cout<<"沒變前:"<<endl; cout<<"v1="<<v1<<endl <<"v2="<<v2<<endl <<"v3="<<v3<<endl; cout<<"改變後:"<<endl; f(); cout<<"v1="<<v1<<endl <<"v2="<<v2<<endl <<"v3="<<v3<<endl; cout<<endl;}void func5(){ cout<<"lambda運算式,可變的值捕獲"<<endl; size_t v1=30;//size_t為unsigned int不帶正負號的整數 size_t v2=20; size_t v3=10; auto f=[v1,v2,v3]() mutable { v1=v2+v3; v2=v1+v3; v3=v1+v2; }; //lambda運算式中[]裡面放的是要傳遞的參數,可以放多個。 cout<<"v1="<<v1<<endl <<"v2="<<v2<<endl <<"v3="<<v3<<endl; cout<<endl; //看到輸出結果是不是覺得很奇怪嗎,不是說可變嗎,結果值還是一樣。這裡的可變是指在lambda運算式中原本值傳遞的參數只能被獲得值。不能對其進行其他動作 //mutable的原因,使其可以像函數裡的變數一樣被使用,可以理解成函數中的值傳遞。函數中的值傳遞就是可以對其參數進行任何操作。}void func6(){ cout<<"lambda運算式,指定傳回型別"<<endl; auto f=[](int i)->int { return i; }; //lambda運算式中[]裡面放的是要傳遞的參數,可以放多個。 cout<<f(50)<<endl; //要指定lambda運算式的傳回型別我們必須用->來設定 cout<<endl; }void main(void){ func1();//值捕獲 func2();//引用捕獲 func3();//隱式值傳遞 func4();//隱式引用傳遞 func5();//可變lambda func6();//指定傳回型別 system("pause");}
如果有什麼不對的地方請大家指出,這幾天整理的lambda運算式的基本用法