lambda 匿名函式
現階段,編譯器會將lanmbda匿名函式,轉換為仿函式!故,stl演算法完全可以使用lambda匿名函式。
auto b2 = [a, &b] (int c) -> int(1000);
[var] 傳值方式(唯讀)將變數傳遞到匿名函式中
[=] 父作用範圍的所有變數以傳值方式(唯讀),傳遞到匿名函式中(包括this)
[&var] 引用方式(讀寫)將變數傳遞到匿名函式中
[&] 父作用範圍的所有變數以引用方式(讀寫),傳遞到匿名函式中(包括this)
[this] 傳遞當前this指標
[=,&var1,&var] var1,var2以讀寫方式傳遞到匿名函式中,其他變數以唯讀方式傳遞到函式中
[&,var1,this] var1,this以唯讀方式傳遞到函式中,其他變數以讀寫方式傳遞到函式中
捕捉非父作用範圍的變數,或者非自變數(如,靜態常量)等,都將導致編譯錯誤。故可以看出,匿名函式
非動態函式,在編譯期就定義了,故不會產生額外開銷。
#include #include /*
* */
int main(void) ; // 將建立的匿名函式賦值給sum
std::cout << typeid(sum).name() << std::endl;
int x = 10, y = 20;
auto result = sum(x, y);
std::cout << "result : " << result << std::endl;
;// 只是宣告了乙個lambda函式,但未呼叫
();// 宣告並呼叫乙個lambda函式
int a = 1, b = 10;
// 無法通過編譯
// ;
[=] ;
std::cout << "b = " << b << std::endl;
[&] (int c) (50);
std::cout << "b = " << b << std::endl;
// [&a, b] (int c) (1000);
auto b2 = [a, &b] (int c) -> int(1000);
std::cout << "b = " << b << " b2 = " << b2 << std::endl;
return 0;
}
#include #include #include struct
} p1;
/* *
*/int main(void) ;
std::for_each(ids.begin(), ids.end(), p1);
std::cout << "\n---------------------------" << std::endl;
std::for_each(ids.begin(), ids.end(), (int& i) );
return 0;
}
lambda與c++11執行緒的使用,非常的靈活,強大。
/*
* file: main.cpp
* author: vicky.h
* email: [email protected]
*/#include #include /*
* */
int main(void) });
t.detach();
for (;;)
}return 0;
}
i = 1
i = 1
i = 2
i = 3
i = 5
i = 5
i = 7
i = 8
c 11 lambda 匿名函式
include include using namespace std placeholders lambda即匿名函式 intmain 格式 captures params ret auto func lambda中變數擷取 不擷取任何變數 擷取外部作用域中所有變數,並作為引用在函式體中使用 擷取...
C 11 lambda使用技巧小結
在lambda中 一般的引數捕獲有 1.值傳遞 2.引用傳遞 官方文件寫傳值只能讀不能寫,但傳引用的話可以讀和寫。如果增加mutable宣告,則可以修改值傳遞的物件。例1j 10 auto by val 1 j mutable by val 1 cout j j endl 結果lambda j 11...
C 11Lambda捕獲列表使用
情況比較多,發現乙個比我總結好的,摘抄之 捕獲值列表,是允許我們在lambda表示式的函式體中直接使用這些值,捕獲值列表能捕獲的值是所有在此作用域可以訪問的值,包括這個作用域裡面的臨時變數,類的可訪問成員,全域性變數。捕獲值的方式分兩種,一種是按值捕獲,一種是按引用捕獲。顧名思義,按值捕獲是不改變原...