日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

lamda表达式和尾置返回类型

發(fā)布時(shí)間:2023/12/15 综合教程 39 生活家
生活随笔 收集整理的這篇文章主要介紹了 lamda表达式和尾置返回类型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基本語法

基本形式如下:

[capture](parameters) mutable ->return-type
{body}

[capture]:叫做捕獲說明符,表示一個(gè)

mutable: mutable修飾符。默認(rèn)情況下,lamda函數(shù)總是一個(gè)const函數(shù),mutable可以取消其常量性,在使用該修飾符時(shí),參數(shù)列表不能省略(即使參數(shù)為空)。

{body}: 函數(shù)體,與普通函數(shù)的函數(shù)體一樣,不過除了可以使用參數(shù)之外,還可以使用所有捕獲的變量。

我們可以這樣輸出"hello,world"

auto func = [] () { cout <<
"hello,world";};

func();
//nowcallthefunction

變量捕獲與閉包實(shí)現(xiàn)

string name;

cin >> name;

[&](){cout << name;}();

lambda函數(shù)能夠捕獲

[] 不截取任何變量[&} 截取外部作用域中所有變量,并作為引用在函數(shù)體中使用[=] 截取外部作用域中所有變量,并拷貝一份在函數(shù)體中使用[=, &foo] 截取外部作用域中所有變量,并拷貝一份在函數(shù)體中使用,但是對foo變量使用引用[bar] 截取bar變量并且拷貝一份在函數(shù)體中使用,同時(shí)不截取其他變量[x, &y] x按值傳遞,y按引用傳遞[this] 截取當(dāng)前類中的this指針。如果已經(jīng)使用了&或者=就默認(rèn)添加此選項(xiàng)。

看到這,不禁要問,這魔法般的變量捕獲是怎么實(shí)現(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ù)對象當(dāng)然沒問題,自己寫的回調(diào)函數(shù),你可以傳個(gè)函數(shù)指針也沒有問題。他們有優(yōu)點(diǎn)也有缺點(diǎn)。函數(shù)對象能維護(hù)狀態(tài),但語法開銷大,而函數(shù)指針語法開銷小,卻沒法保存范圍內(nèi)的狀態(tài)。如果你覺得魚和熊掌不可兼得,那你可錯(cuò)了。

2.尾置返回類型

有時(shí)候,當(dāng)希望編寫一個(gè)函數(shù)來接收某個(gè)序列容器中返回的一個(gè)元素的應(yīng)用時(shí)候,你可能就不太能夠想明白應(yīng)該如何寫出這個(gè)函數(shù)的返回值類型了:

template <typename T>
return_type &getItem(T begin, T end) {
    return *begin; // 返回序列中一個(gè)元素的引用
}

這里的return_type應(yīng)該怎么寫呢?事實(shí)上,我們可能會想到使用decltype()來獲得這個(gè)類型,但是,編譯器在讀到這個(gè)函數(shù)定義的時(shí)候,begin 甚至還沒有出現(xiàn),這時(shí)候我們似乎沒有任何辦法直接在返回類型的時(shí)候?qū)懴逻@個(gè)返回類型。

C++11 提供了一種新的書寫返回值的方式,那就是將返回類型尾置。尾置的返回類型允許我們在參數(shù)列表之后申明返回的類型,我們的代碼可以寫成:

template <typename T>
auto &getItem(T begin, T end) -> decltype(*begin) {
    return *begin; // 返回序列中一個(gè)元素的引用
}

其中,我們使用 decltype 告知了編譯器返回類型與參數(shù)表中的返回類型相同,而 decltype 會自動(dòng)推斷為元素類型的引用,完成了我們的需求。



總結(jié)

以上是生活随笔為你收集整理的lamda表达式和尾置返回类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。