c++11标准:匿名函数(匿名表达式)lambda
lambda:
C++11提供了對匿名函數(shù)的支持,稱為Lambda函數(shù)(也叫Lambda表達(dá)式). Lambda表達(dá)式具體形式如下:
匿名函數(shù)定義/匿名表達(dá)式聲明:[capture](parameters)->return-type{body}
函數(shù)調(diào)用:function a =?[capture](parameters)->return-type{body};
a(parameters);
?
parameters:形參
和函數(shù)一樣
如果沒有參數(shù),空的圓括號()可以省略.
返回值也可以省略,如果函數(shù)體只由一條return語句組成或返回類型為void的話.形如:
?[capture](parameters){body}
返回值類型可以通過以下算法推演出來
-
- 如果 lambda 代碼塊中包含了 return 語句,則該 lambda 表達(dá)式的返回類型由 return 語句的返回類型確定。
- 如果沒有 return 語句,則類似 void f(...) 函數(shù)。
-
例如:
[](int x, int y) { return x + y; } // 隱式返回類型 [](int& x) { ++x; } // 沒有return語句 -> lambda 函數(shù)的返回類型是'void' []() { ++global_x; } // 沒有參數(shù),僅訪問某個全局變量 []{ ++global_x; } // 與上一個相同,省略了()[]:外部閉包
Lambda函數(shù)可以引用在它之外聲明的變量. 這些變量的集合叫做一個閉包.??閉包被定義在Lambda表達(dá)式聲明中的方括號[]內(nèi).
閉包可以按值、引用捕獲:
例如:
[] //未定義變量.試圖在Lambda內(nèi)使用任何外部變量都是錯誤的. [x, &y] //x 按值捕獲, y 按引用捕獲. [&] //用到的任何外部變量都隱式按引用捕獲 [=] //用到的任何外部變量都隱式按值捕獲 [&, x] //x顯式地按值捕獲. 其它變量按引用捕獲 [=, &z] //z按引用捕獲. 其它變量按值捕獲對this的捕獲:只可以是值捕獲,
在類成員中的lamda函數(shù):
對protect和priviate成員來說, 這個lambda函數(shù)與創(chuàng)建它的成員函數(shù)有相同的訪問控制.
訪問this的成員不必使用this->語法,可以直接訪問.
注意:如果一個閉包含有局部變量(類和局部)的引用,在超出創(chuàng)建它的作用域之外的地方被調(diào)用的話,這種行為是未定義的!
?
?
lambda函數(shù)是一個依賴于實現(xiàn)的函數(shù)對象類型,這個類型的名字只有編譯器知道.
如果用戶想把lambda函數(shù)做為一個參數(shù)來傳遞, 那么形參的類型必須是模板類型或者必須能創(chuàng)建一個std::function類似的對象去捕獲lambda函數(shù).
使用 auto關(guān)鍵字可以幫助存儲lambda函數(shù), ?
?
轉(zhuǎn)載于:https://www.cnblogs.com/yiii/p/5139130.html
總結(jié)
以上是生活随笔為你收集整理的c++11标准:匿名函数(匿名表达式)lambda的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020最新省市区县编码
- 下一篇: s3c2440移植MQTT