lamda表达式和尾置返回类型
基本語法
基本形式如下:
[capture](parameters) mutable ->return-type
{body}
[capture]:叫做捕獲說明符,表示一個
mutable: mutable修飾符。默認情況下,lamda函數(shù)總是一個const函數(shù),mutable可以取消其常量性,在使用該修飾符時,參數(shù)列表不能省略(即使參數(shù)為空)。
{body}: 函數(shù)體,與普通函數(shù)的函數(shù)體一樣,不過除了可以使用參數(shù)之外,還可以使用所有捕獲的變量。
我們可以這樣輸出"hello,world"
auto func = [] () { cout <<
"hello,world";};
func();
//nowcallthefunction
變量捕獲與閉包實現(xiàn)
string name;
cin >> name;
[&](){cout << name;}();
lambda函數(shù)能夠捕獲
[] 不截取任何變量[&} 截取外部作用域中所有變量,并作為引用在函數(shù)體中使用[=] 截取外部作用域中所有變量,并拷貝一份在函數(shù)體中使用[=, &foo] 截取外部作用域中所有變量,并拷貝一份在函數(shù)體中使用,但是對foo變量使用引用[bar] 截取bar變量并且拷貝一份在函數(shù)體中使用,同時不截取其他變量[x, &y] x按值傳遞,y按引用傳遞[this] 截取當前類中的this指針。如果已經(jīng)使用了&或者=就默認添加此選項。
看到這,不禁要問,這魔法般的變量捕獲是怎么實現(xiàn)的呢?原來,
最后,lambda函數(shù)的類型是什么呢,答案是std:function。
////////////////////////////////////////////////////////////////////////////////////////////////
為什么需要函數(shù)
匿名函數(shù)是許多編程語言都支持的概念,有函數(shù)體,沒有函數(shù)名。
#include <algorithm>
#include <cmath>
void abssort(float* x, unsigned N) {
std::sort(x, x + N,
// Lambda expression begins
[](float a, float b) {
return std::abs(a) < std::abs(b);
});
}
你可能會問,使用函數(shù)對象不是也可以嗎?是的,函數(shù)對象當然沒問題,自己寫的回調(diào)函數(shù),你可以傳個函數(shù)指針也沒有問題。他們有優(yōu)點也有缺點。函數(shù)對象能維護狀態(tài),但語法開銷大,而函數(shù)指針語法開銷小,卻沒法保存范圍內(nèi)的狀態(tài)。如果你覺得魚和熊掌不可兼得,那你可錯了。
2.尾置返回類型
有時候,當希望編寫一個函數(shù)來接收某個序列容器中返回的一個元素的應用時候,你可能就不太能夠想明白應該如何寫出這個函數(shù)的返回值類型了:
template <typename T>
return_type &getItem(T begin, T end) {
return *begin; // 返回序列中一個元素的引用
}
這里的return_type應該怎么寫呢?事實上,我們可能會想到使用decltype()來獲得這個類型,但是,編譯器在讀到這個函數(shù)定義的時候,begin 甚至還沒有出現(xiàn),這時候我們似乎沒有任何辦法直接在返回類型的時候?qū)懴逻@個返回類型。
C++11 提供了一種新的書寫返回值的方式,那就是將返回類型尾置。尾置的返回類型允許我們在參數(shù)列表之后申明返回的類型,我們的代碼可以寫成:
template <typename T>
auto &getItem(T begin, T end) -> decltype(*begin) {
return *begin; // 返回序列中一個元素的引用
}
其中,我們使用 decltype 告知了編譯器返回類型與參數(shù)表中的返回類型相同,而 decltype 會自動推斷為元素類型的引用,完成了我們的需求。
總結(jié)
以上是生活随笔為你收集整理的lamda表达式和尾置返回类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: printf 指针地址_数组指针和指针数
- 下一篇: pycharm格式化代码快捷键_你写的