目錄
lambda表達式書寫格式:
lambda表達式各部分說明:
lambda的使用示范:
注意事項:?
?返回值類型可以省略,參數也可也省略:
sort內部也可以直接寫lambda表達式:?
排序時利用lambda進行排序:?
lambda的類型:
捕捉列表的使用方式 和 mutable為什么省略 ? ?
lambda的特殊使用方式:?
混合捕捉:?
lambda表達式書寫格式:
[capture-list] (parameters) mutable -> return-type { statement }
lambda表達式各部分說明:
- [capture-list] : 捕捉列表,該列表總是出現在lambda函數的開始位置,編譯器根據[]來 判斷接下來的代碼是否為lambda函數,捕捉列表能夠捕捉上下文中的變量供lambda 函數使用。
- (parameters):參數列表。與普通函數的參數列表一致,如果不需要參數傳遞,則可以 連同()一起省略
- mutable:默認情況下,lambda函數總是一個const函數,mutable可以取消其常量 性。使用該修飾符時,參數列表不可省略(即使參數為空)。?
- ->returntype:返回值類型。用追蹤返回類型形式聲明函數的返回值類型,沒有返回 值時此部分可省略。返回值類型明確情況下,也可省略,由編譯器對返回類型進行推 導。
- {statement}:函數體。在該函數體內,除了可以使用其參數外,還可以使用所有捕獲 到的變量。
注意:在lambda函數定義中,參數列表和返回值類型都是可選部分,而捕捉列表和函數體可以為 空。因此C++11中最簡單的lambda函數為:[]{}; 該lambda函數不能做任何事情。?
根據lambda的表達式,可以看出 lambda的本質是一個匿名函數,其次捕捉列表雖然可以為空,但是不能被省略,而mutable在默認的情況下可以省略,只有在特殊的情況下才進行使用。
lambda的使用示范:
注意事項:?
?返回值類型可以省略,參數也可也省略:
返回值在明確的時候可以省略!因為編譯器它會自動推導!同樣參數也可以省略!前提是沒有參數!
sort內部也可以直接寫lambda表達式:?
排序時利用lambda進行排序:?
lambda的類型:
?每一個lambda表達式都是不一樣的,可以看到下圖中的lambda后面跟隨著的一串數字亂碼都是不固定的。
?其次,lambda的本質是一個仿函數,是因為lambda的底層或是說它的內部會更具lambda的內容生成對應的仿函數,不過是類似于仿函數,因為調用lambda本質上是調用operator()
捕捉列表的使用方式 和 mutable為什么省略 ? ?
如上圖所示,捕捉列表[]內部并沒有任何的參數,反而是參數列表中進行了傳址調用,這里使得lambda是變成了一個匿名函數,而如果想只捕捉變量 a 和 b 則需要將ab放入捕捉列表中,參數列表變為空即可,但是把a和b放入捕捉列表又會出現一些小問題:
?因為捕捉的變量是拷貝,而不是直接進行傳址拷貝的,而是傳值拷貝的,同時捕獲的變量是被const修飾的,也就是捕獲列表的a,b是不可修改的,所以這里就需要mutable?
?
但是還是沒有什么意義,應為把捕獲的a,b變得可以修改數值,但是捕獲的a,b和外面變量a,b不是同一個a,b,所以沒有意義,因為捕獲列表的捕獲是傳值拷貝,不是傳址拷貝,所以這樣使用mutable和這樣寫法的捕獲列表是無效的,沒有意義的。
如果想要同時修改外面的變量,可以使用&進行引用捕獲:
但是&是引用和取地址在這里會出問題,容易弄混,這下面是引用方式捕捉:
?同時也可以使用傳指針的方式進行交換來改變外面的變量
lambda的特殊使用方式:?
?[=]傳值捕捉所有,[&]傳引用捕捉所有,前者是傳值調用,捕獲所有變量的數值,后者是引用調用,捕獲所有的變量并且進行引用
混合捕捉:?
?